【问题标题】:Java IBM-860 Encoding ProblemsJava IBM-860 编码问题
【发布时间】:2018-07-23 14:03:23
【问题描述】:

我有一台配置为使用 PC860 代码页的打印机。

根据本站 (http://www.madore.org/~david/computers/unicode/cstab.html#CP860),我们有以下内容:

HEX    CHAR
0xB3   │
0x86   Á

所以,我正在尝试将以下字符串发送到打印机

Sring test = "\u00B3Á\u00B3"

但是,除了调用 String.getBytes() 时使用的编码之外,我得到了不想要的结果:

使用ISO-8859-1、0xB3打印正确,但Á不正确。 Á 被映射到 0xC1。

使用IBM-860、Á 可以正确打印,但\u00B3不要。 \u00B3 被映射到 0x3F。

使用ISO-8859-1,如果我将字符串更改为\u00B3\u0086\u00B3(将À 替换为它的十六进制值),就会得到正确的结果。

我无法意识到我做错了什么。任何人都可以显示我缺少的东西吗?

void printString(String str) throws IOException {

    //os is a OutputStream

    //Using IBM-860 Charset...
    os.write(str.getBytes(Charset.forName("IBM-860")));

    //Using ISO-8859-1 Charset...
    os.write(str.getBytes(Charset.forName("ISO-8859-1")));

}

【问题讨论】:

    标签: java character-encoding iso-8859-1


    【解决方案1】:

    Java 字符串总是 UTF-16 编码 - 因此您需要对要使用的字符使用 UTF-16 编码:

    String test = "│Á";
    os.write(test.getBytes(Charset.forName("IBM-860")));
    

    如果您已经知道字节序列的样子和/或 JVM 不支持您的编码,那么不要使用字符串;将字节直接写入OutputStream:

    byte[] b = { (byte) 0xB3, (byte) 0x86 };
    os.write(b);
    

    【讨论】:

    • 你好@ErwinBolwidt,非常感谢,它成功了!但只是为了澄清:当我使用 unicode 表示形式时,例如 \u00B3,为什么它不起作用?不应该将\u00B3 映射到|,然后以与上面相同的方式存储为UTF-16 吗?
    • @regisxp Unicode 字符 \u00b3 是上标 3 字符 (³),而不是管道字符。 fileformat.info/info/unicode/char/b3/index.htm
    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 2013-11-12
    • 2017-01-28
    • 2012-12-08
    • 2013-06-12
    • 2015-06-11
    • 2012-06-11
    相关资源
    最近更新 更多