我对代表阿拉伯字符所需的存储感到有些困惑。
如果这是真的,请告诉我:
每种编码有哪些优点?我们什么时候应该选择一个而不是另一个?
答案 0 :(得分:10)
首先,Unicode不是编码。它是为每种语言中的每个字符分配代码点的标准。这些代码点是整数;它们占用的字节数取决于特定的编码。最常见的Unicode编码是UTF-8和UTF-16。
总结:
我将使用两个例子:'Í'(U + 062D)和'ى'(U + FEF0)。这些数字是十六进制代码,代表每个字符的Unicode代码点。
在ISO 8859-6中,大多数阿拉伯字符只占用一个字节,因为该编码专用于阿拉伯语。例如,字符'Í'(U + 062D)被编码为单字节“CD”,您可以从Wikipedia article上的表中看到。字符'ى'(U + FEF0)被列为“阿拉伯语演示表单”,所以我想这解释了为什么它根本没有出现在ISO 8859-6中(你无法在该编码中对这个字符进行编码)
有两种非常常见的Unicode编码可让您对所有字符进行编码:UTF-8和UTF-16。它们的用途略有不同。 UTF-8对ASCII字符使用一个字节,对于基本字符(包括所有阿拉伯语)使用2到3个字节,对于其他字符使用4个字节。 UTF-16对基本字符使用两个字节,对其他字符使用4个字节。所以基本上,如果你使用大量的ASCII,UTF-8会更好。对于国际文本,UTF-16更好。
在UTF-8中,'Í'(U + 062D)编码为2字节序列“D8 AD”,而'ى'(U + FEF0)编码为3字节序列“EF BB B0 ”。基本上,U + 0080和U + 07FF之间的字符使用2个字节,U + 07FF和U + FFFF之间的字符使用3个字节。因此,所有基本的阿拉伯语和阿拉伯语补充字符使用2个字节,而阿拉伯语表示形式使用3个字节。
在UTF-16中,'Í'(U + 062D)编码为2字节序列“2D 06”,而'ى'(U + FEF0)编码为2字节序列“F0 FE” 。在UTF-16中,所有阿拉伯字符都是两个字节。字节序使这变得更加复杂。请注意,UTF-16中的字节只是两个部分交换的代码点。同样有效的编码是第一个的“06 2D”,第二个的“FE F0”。
总之,我通常会推荐UTF-8,因为它非常明确并且支持ASCII文本。在任一编码中,阿拉伯字符都是2个字节(除非您使用“表示形式”)。你可以使用ISO 8859-6,如果你只使用ASCII和阿拉伯字符,没有别的,这将节省你一些空间,但它通常是不值得的,因为它会一旦其他一些字符出现就会中断。 UTF-8和UTF-16支持Unicode中的所有字符。
答案 1 :(得分:1)
有几种不同的unicode编码,使用的空间量取决于您使用的是哪一种:http://unicode.org/faq/utf_bom.html