0

在阅读了 Joel 关于 Unicode 的文章后,我仍然对自己的 unicode 知识感到非常不确定。具体来说,我留下了这个问题:

假设我有一个代码点太大而无法适应某些编码(即 ASCII)的字符串,例如:

U+67CF U+1AAB U+ABCD U+7034

然后乔尔说:

如果你试图在你试图表示它的编码中表示的 Unicode 代码点没有等价物,你通常会得到一个小问号:?或者,如果你真的很好,一个盒子。

但是这个字符串看起来像什么(在二进制/十六进制级别)以 ASCII 编码或其他一些大小不足的编码?

4

2 回答 2

2

如果将字符串(例如,“ユニコード”)转换为 ASCII,则 ASCII 中没有定义可以表示任何这些字符的代码。这完全取决于转换软件应该做什么。通常,该软件会将它无法编码的任何字符替换为“?”,即字面上的 ASCII 问号字符。然后,该字符串是包含常规 ASCII 问号字符的常规 ASCII 字符串。

作为对 Joel 文章的更深入跟进,请参阅每个程序员绝对、积极需要了解的关于使用文本的编码和字符集的知识。

于 2012-09-14T16:20:10.150 回答
2

引用的声明没有多大意义。如果编码没有 Unicode 代码点的代码,那么您根本无法在其中表示该代码点。就是这样。例如,您不能用 ASCII 表示“é”。

也许该语句的意思是,如果您尝试将字符串从一种编码转换为另一种编码,并且字符串中的某些字符在目标编码中没有表示,那么您可能会看到奇数字符。嗯,是的,但你也可以看到其他任何东西。转换程序可以将“é”映射到“e”,或者它可以发出错误消息并拒绝正确生成输出。通常,后者是正确的举动。

但在某些情况下,转换是即时进行的,不能纠缠于人际互动,但必须做一些事情。那时当然不再是字符码转换,而是广义上的转换。它可以应用许多不同的策略,比如只是删除字符,或者通过某种逻辑将它们映射到可表示的字符或字符组合,甚至更改目标编码。

于 2012-09-14T16:26:16.777 回答