You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:59:56