日语全角字符 ー 在 Java 中转换为 SHIFT_JIS 时出现乱码 [duplicate]

Japanese fullwidth character ー is getting garbled when converted to SHIFT_JIS in Java [duplicate]

提问人:Prince 提问时间:8/23/2023 最后编辑:Prince 更新时间:8/23/2023 访问量:84

问:

在我的应用程序中,我正在从数据库(UTF-8)读取数据(日语文本),并尝试以SHIFT_JIS文件格式写入输出。但是,全角ー(移位JIS中的817C十六进制代码)被转换为?在输出文件中。

这是测试它的示例程序

public class ShiftJisTest {

    public static void main(String[] args) {
        String text = "東1-1";
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new FileOutputStream("output_data"), "SHIFT_JIS"))) {
            writer.write(text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出:

東1?1

输出的十六进制代码值:

93 8C 82 50 3F 82 50

HEX 中的乱码字符:,预期为3F81 7C

Java UTF-8 字符编码 文件输出流 shift-jis

评论

1赞 Basil Bourque 8/23/2023
我建议将该示例字符串减少到显示您的问题所需的尽可能少的字符数。
0赞 Prince 8/23/2023
这是字符有问题的输入和输出。输入:字符串文本 = “1-”;输出:1?
1赞 Kayaman 8/23/2023
,这是 U+2212 减号。这在我的机器上重现,因为连字符被翻译成.0x817C3F/?
1赞 Basil Bourque 8/23/2023
第二个注释中的这两个字符是 65297 和 65293 十进制。请参阅在 Ideone.com 运行的代码。字符名称为 Fullwidth Digit One 和 Fullwidth Hyphen-Minus。
1赞 skomisa 8/23/2023
通过测试,您似乎还可以指定“windows-31j”或“MS932”或“cp932”而不是“windows-932”。我不知道非 Windows 环境中支持哪些名称(如果有)。

答:

0赞 g00se 8/23/2023 #1

看起来该角色不在Shift_Jis:

goose@t410:/tmp$ uniname '\uFF0D'
The name for codepoint \uFF0D is FULLWIDTH HYPHEN-MINUS
The char is -
goose@t410:/tmp$ echo -en '\uFF0D' | iconv -t SHIFT-JIS
iconv: illegal input sequence at position 0

评论

0赞 Kayaman 8/23/2023
尽管根据转换器的不同,它可以/应该转换为减号。
0赞 skomisa 8/23/2023
这也许可以解释OP的问题,但它并不能解决它。
0赞 g00se 8/23/2023
解决方案是不要使用不存在的字符。可以使用替换,但这是任意和主观的
0赞 skomisa 8/24/2023
不,这根本不是解决方案。解决方案是为正在处理的文本选择适当的编码。OP 的问题只是因为使用了不适当的编码。
0赞 g00se 8/24/2023
据推测,@Prince使用Shift_Jis是有原因的。如果他没有,那么解决方案很简单 - 使用 UTF-8。