1

我正在尝试获取一些旧代码来正确显示中文字符。我尝试使用的一种字符编码以 0x7F 开头,长度为 4 个字节(包括 0x7F 字节)。有谁知道这是哪种编码以及我在哪里可以找到它的信息?谢谢..

更新:我还必须使用一些日语编码,每个字符都以 0xE3 开头,长度为三个字节。如果我在 Windows 中选择日语语言环境,它会正确显示在我的计算机上,但是,它不会在我们的应用程序中正确显示。但是,如果选择了除日语以外的任何其他语言环境,我什至无法正确查看文件名。所以我猜这种编码不是Unicode。有人知道这是什么吗?是ANSI吗?是 Shift JIS 吗?

对于中文,我用 Unicode 和 UTF-8 字符对其进行了测试,我得到了相同的模式;0x7F 后跟三个字节。Unicode 和 UTF-8 是一样的吗?

4

5 回答 5

8

我正在尝试使用的一种字符编码以 0x7F 开头,长度为 4 个字节

其他字节是什么?你有这种编码的拉丁文吗?

如果它是“0x7f 0x...0x00 0x00”,那么您正在查看 UTF-32LE。它也可以是两个 UTF-16(LE 或 BE)字符。

大多数东亚编码使用 0x80-0xFF 作为非 ASCII 字符的前导字节;我知道没有人会使用前导 0x7F 作为 ASCII 删除以外的任何内容。

预计到达时间:

应该有字节顺序标记吗?

如果有一种带外方式表明编码是“UTF-32LE”(可能在它到达您之前就丢失了),则不需要 BOM。

我还必须使用一些日语编码,每个字符都以 0xE3 开头,长度为三个字节。

那肯定是UTF-8。序列 0xE3 0x... 0x... 将导致 U+3000 和 U+4000 之间的字符,这是平假名/片假名所在的位置。

如果我在 Windows 中选择日语语言环境,它会正确显示在我的计算机上,但是,它不会在我们的应用程序中正确显示。

那么您的应用程序很可能是令人遗憾的一大群不符合 Unicode 的应用程序之一,仍然在以“W”为后缀的应用程序中使用“A”(*)版本的 Win32 接口。您是否可以根据其实际编码读取字符串是没有实际意义的:不符合 Unicode 的应用程序将永远无法在西方语言环境中显示东亚表意文字。

(*:以“ANSI”命名,这是 Windows 对“当前系统代码页设置的任何内容”的误导性术语。这就是更改区域设置会影响它的原因。)

预计到达时间(2):

好的,破解了。这不是我以前遇到过的任何标准化编码,但如果您假设 Unicode 代码点正在被编码,那么它相对容易破译。

0x00-0x7E: plain ASCII
0x7F A B C: Unicode character

以 Unicode 转义编码的字符可以通过获取 A、B 和 C 的键字符串中的索引并将其相加来计算:

A*0x1000 + B*0x40 + C

也就是说,它是一个 base-64 字符集,但它不是通常的 Base64 标准。一个小实验给出了一个关键字符串:

.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

这 '。' 和 '_' 字符是猜测,因为您发布的字符都没有使用它们。我们需要更多数据来找出确切的字符串。

因此,例如:

0x7F 3 u g
A=4 B=58 C=44
4*0x1000 + 58*0x40 + 44 = 0x4EAC
U+4EAC = 京

预计到达时间(3):

是的,通过手动提取每个代码点并作为字符加入来创建本机 Unicode 字符串应该很容易。不太确定在您使用的任何平台上都有什么可用的,但任何支持 Unicode 的平台都应该能够简单地从代码点生成字符串(并且希望无需手动重新编码为 UTF-16LE 字节)。

我注意到这三个示例字符在相同的一般范围内具有第一个转义字符,并且与它们的 Unicode 代码点具有相同的数字顺序,因此我认为它一定是 Unicode 代码点。其他两个字符似乎是随机变化的,所以它很可能是代码点的大端编码,并且可能作为 6 的 base-64 编码是您可以从可读 ASCII 中获得的尽可能多的位。

标准 Base64 本身以字母开头,这会使以数字开头的东西在基本多语言平面中太远了。所以我开始猜测 '0123456789ABCDEFG...' 这将是另一个明显的键字符串选择。这样得到的数字接近给定字符的代码点,但有点太低了。在密钥字符串的开头插入一个额外的字符(因此数字“0”不映射到数字 0)使其中一个字符正确,另外两个非常接近;正确的那个没有小写字母,所以为了只更改小写字母,我在大写和小写之间插入了另一个字符。这得出了正确的数字。

不能保证这实际上是正确的,但是(除了插入字符的任意选择)它很可能是正确的。

于 2009-03-25T15:02:34.820 回答
1

您可能想查看维基百科上的中文字符编码页面。我可以看到的唯一编码总是 4 个字节是UTF-32

GB 18030是当前标准的中文字符集,但长度可以为 1 到 4 个字节。

于 2009-03-25T07:29:53.350 回答
1

试试chardet。它可以很好地猜测一串字节的字符编码。

Unicode 和 UTF-8 是一样的吗?

不,UTF-8 只是将 Unicode 字符表示为字节序列的一种方式。Unicode 是完整的标准,为每个字符分配数字和人类可读的标识符,以及有关字符的大量元数据。

于 2009-03-26T02:24:35.820 回答
0

它可能是有效的 unicode 编码,例如 utf-8 或 UTF16 代理对。

于 2009-03-25T07:29:34.910 回答
0

是的,中文是UTF-8,是Unicode的一种实现(编码)。UTF-8 的 ASCII 字符长度为 1 个字节,其他字符最多为 4 个字节。

于 2009-03-26T01:47:51.447 回答