gpt4 book ai didi

groovy - EBCDIC 代码页不转换小写 'a'

转载 作者:行者123 更新时间:2023-12-01 15:07:08 25 4
gpt4 key购买 nike

我正在尝试使用 IBM 代码页将字符串从 ASCII 转换为 EBCDIC。除了转换为不可打印字符的小写字母“a”外,转换是正确的。

这是一段在 Windows 7 中运行的 groovy 脚本,它说明了这个问题。

groovy:000> letters='abcdABCD'
===> abcdABCD
groovy:000> String.format("%04x", new BigInteger(1, letters.getBytes())
===> 6162636441424344
groovy:000> lettersx=new String(letters.getBytes('IBM500'))
===> ?éâä┴┬├─
groovy:000> String.format("%04x", new BigInteger(1, lettersx.getBytes()))
===> 3f828384c1c2c3c4

转换为 EBCDIC 后,字符串中的所有字符均有效,但第一个字符是小写字母“a”。尽我所能,我找不到关于这个问题的任何信息。我已经尝试了许多具有相同结果的 IBM 代码页(IBM01140、IBM1047 等)

最佳答案

问题出在这个表达式中:

new String(letters.getBytes('IBM500'))

letters.getBytes 创建一个包含(十六进制)的字节数组:

 81 82 83 84 C1 C2 C3 C4

但随后您会立即使用平台默认编码将其转换回 Unicode 字符串:

 new String( <byte-array> );

如果您希望字符串中字符的序数值等于字节值,您必须指定一个编码来实现这一点,例如 ISO-8859-1:

new String(letters.getBytes('IBM500'), "ISO-8859-1")

您使用的编码未定义字节 81 的字符编码,因此它将替换为 ? (3f)。您最有可能使用 Windows-1252 .

字符串包含字符,而不是字节。从一个到另一个时,Java 将始终应用编码转换。

编辑:回应@mister270 的评论:

这里有一个 Java 程序来演示:

public class Ebcdic
{
public static void main(String[] args) throws Exception
{
String letters = "abcdABCD";

byte[] ebcdic = letters.getBytes("IBM500");

System.out.print("Ebcdic bytes:");
for (byte b: ebcdic)
{
System.out.format(" %02X", b & 0xFF);
}
System.out.println();

String lettersEbcdic = new String(ebcdic, "ISO-8859-1");

System.out.print("Ebcdic bytes stored in chars:");
for (char c: lettersEbcdic.toCharArray())
{
System.out.format(" %04X", (int) c);
}
System.out.println();

System.out.println("Ebcdic bytes in chars printed in using my default platform encoding: " + lettersEbcdic);
}
}

输出是:

Ebcdic bytes: 81 82 83 84 C1 C2 C3 C4
Ebcdic bytes stored in chars: 0081 0082 0083 0084 00C1 00C2 00C3 00C4
Ebcdic bytes in chars printed in using my default platform encoding: ????��ǎ

这表明的是

  • 使用“IBM500”正确地将 Ebcdic 转换为字节数组
  • 使用“ISO-8859-1”的字节到字符的“身份”转换正确发生
  • 我的系统没有将 Unicode 字符 U+0081 等转换为我的默认平台字符编码的映射,因此它显示为 ?

Java(Groovy 也是如此)在内部将字符存储为 Unicode。 UTF16,准确地说。如果您想将它们编码为 Ebcdic,那么它们就不再是字符并且不应再保存在字符串中。 Ebcdic 是一种 8 位编码,因此每个字符都可以存储在一个字节中。如果您需要与需要特定编码(在您的情况下为 Ebcdic)的系统交互,那么该系统确实应该接受字节,而不是字符串,否则您最终只会遇到这些困惑。

如果您必须使用字符串来保存 Ebcdic 字节,那么无论何时您使用 InputStream 或 OutputStream(包括 System.out)都必须使用 ISO-8859-1 编码以确保您的 ebcdic 代码不是从字节“翻译”而来到字符

关于groovy - EBCDIC 代码页不转换小写 'a',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com