Shift_JIS转UTF-8时全角波浪符[~]显示异常(变粗)问题咨询
解决Shift_JIS转UTF-8时全角波浪符显示异常的问题
这个问题其实是字符编码映射的细节差异导致的——你在Shift_JIS文件里的全角波浪符是U+FF5E(Fullwidth Tilde),而你手动输入的是U+301C(Wave Dash),这两个字符视觉上极其相似,但确实是不同的Unicode码点,所以转码后显示的U+FF5E会看起来更粗,和手动输入的U+301C有明显差异。
为什么会出现这个问题?
Shift_JIS(包括兼容的MS932编码)标准里,全角波浪符对应的Unicode码点就是U+FF5E;而现在很多现代输入场景(比如输入法、文本编辑器)默认输入的是U+301C,这就造成了转码后的显示不一致。
解决方案:转码时替换目标字符
你只需要在读取Shift_JIS内容后,把U+FF5E替换成U+301C再写入UTF-8文件即可。修改后的代码如下:
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(inFile), Charset.forName("MS932")))) { try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8))) { String line; while ((line = in.readLine()) != null) { // 将全角tilde(U+FF5E)替换为全角波浪号(U+301C) String convertedLine = line.replace('\uFF5E', '\u301C'); out.write(convertedLine); out.newLine(); } } }
如果偏好使用IOUtils.copy,可以先把内容全部读取到内存中完成替换,再写入:
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(inFile), Charset.forName("MS932")))) { try (BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8))) { // 读取全部内容 String content = IOUtils.toString(in); // 替换字符后写入 out.write(content.replace('\uFF5E', '\u301C')); } }
验证效果
替换完成后,转码生成的UTF-8文件里的波浪符码点就会和你手动输入的U+301C完全一致,显示效果也会正常统一。你可以用Unicode字符查看工具(比如文本编辑器的字符编码查看功能)来确认码点是否正确。
内容的提问来源于stack exchange,提问作者sikidhart
相关产品推荐
相关产品推荐

