影响 KDiff3 的中文 unicode 字符稍和稊有什么奇怪的吗?
Anything odd about Chinese unicode characters 稍 and 稊 that would affect KDiff3?
我已在 KDiff3 站点 (https://sourceforge.net/p/kdiff3/bugs/198/) 报告了一个错误并输入了支持请求,但我想知道是否有人为我提供了关于我所看到的行为的任何提示信息,这些信息可能会让我理解为什么会存在这样的错误——如果这些 unicode 字符有任何异常。
当我使用 KDiff3 版本 0.9.98 合并两个包含字符“稻”的相同文件时,它将字符读取为“稻”并在合并的所有窗格中显示该字符。然后输出包含该字符而不是稍。
我在 KDiff3 的 0.9.98 版中用 UCS-2 Little Endian 编码观察到这种行为,但在 UTF-8 编码中没有,没有 [=11] =]版本 0.9.96a TortoiseHg 附带的 Kdiff3 版本。虽然我可以在 0.9.96 和 0.9.97 中重现该问题,但 TortoiseHg 的 KDiff3 报告它是 0.9.96a 版本,并没有出现问题。
编辑:我隐约怀疑问题出在Qt库的某个地方。因此,任何有关 Qt 做什么的信息,尤其是在处理国际文本方面的信息都可能有用。
处理文本文件的实用程序需要将文本分解为字符才能有效运行。最简单的可能过程是将每个 8 位字节视为单个字符。不幸的是,这不适用于 UTF-16 或 UCS-2 输入,因为每个字节只是字符的一半。
您遇到问题的字符是稍 (U+7a0d),正在转换为稊 (U+7a0a)。当您将它们分解为小端字节时,您会得到 0x0d, 0x7a
和 0x0a, 0x7a
。 8位字符0x0d
是Return的ASCII码,0x0a
是换行的代码。似乎 KDiff3 将这些字节解释为行尾,并在遇到 Return 时替换换行符。您报告的错误消息表明文件中的行结尾不一致,这证实了这一点。
使用 Unicode 时,通常最好使用 UTF-8 编码。 U+007f 以上的字符仍将占用一个以上的字节,但这些字节中的每一个都将具有 0x80 或更大的值,并且不会意外地被误认为是 ASCII 字符之一。例如稍变成0xe7, 0xa8, 0x8d
.
我已在 KDiff3 站点 (https://sourceforge.net/p/kdiff3/bugs/198/) 报告了一个错误并输入了支持请求,但我想知道是否有人为我提供了关于我所看到的行为的任何提示信息,这些信息可能会让我理解为什么会存在这样的错误——如果这些 unicode 字符有任何异常。
当我使用 KDiff3 版本 0.9.98 合并两个包含字符“稻”的相同文件时,它将字符读取为“稻”并在合并的所有窗格中显示该字符。然后输出包含该字符而不是稍。
我在 KDiff3 的 0.9.98 版中用 UCS-2 Little Endian 编码观察到这种行为,但在 UTF-8 编码中没有,没有 [=11] =]版本 0.9.96a TortoiseHg 附带的 Kdiff3 版本。虽然我可以在 0.9.96 和 0.9.97 中重现该问题,但 TortoiseHg 的 KDiff3 报告它是 0.9.96a 版本,并没有出现问题。
编辑:我隐约怀疑问题出在Qt库的某个地方。因此,任何有关 Qt 做什么的信息,尤其是在处理国际文本方面的信息都可能有用。
处理文本文件的实用程序需要将文本分解为字符才能有效运行。最简单的可能过程是将每个 8 位字节视为单个字符。不幸的是,这不适用于 UTF-16 或 UCS-2 输入,因为每个字节只是字符的一半。
您遇到问题的字符是稍 (U+7a0d),正在转换为稊 (U+7a0a)。当您将它们分解为小端字节时,您会得到 0x0d, 0x7a
和 0x0a, 0x7a
。 8位字符0x0d
是Return的ASCII码,0x0a
是换行的代码。似乎 KDiff3 将这些字节解释为行尾,并在遇到 Return 时替换换行符。您报告的错误消息表明文件中的行结尾不一致,这证实了这一点。
使用 Unicode 时,通常最好使用 UTF-8 编码。 U+007f 以上的字符仍将占用一个以上的字节,但这些字节中的每一个都将具有 0x80 或更大的值,并且不会意外地被误认为是 ASCII 字符之一。例如稍变成0xe7, 0xa8, 0x8d
.