我对表示阿拉伯字符所需的存储空间有些困惑。
如果是这样,请告诉我:
每种编码的优点是什么?我们什么时候应该优先于另一个?
最佳答案
首先,Unicode不是编码。这是为每种语言的每个字符分配代码点的标准。这些代码点是整数。它们占用多少字节取决于特定的编码。最常见的Unicode编码是UTF-8和UTF-16。
总结一下:
我将使用两个示例:“ح”(U + 062D)和“ﻰ”(U + FEF0)。这些数字是十六进制代码,代表每个字符的Unicode代码点。
在ISO 8859-6中,大多数阿拉伯字符仅占用一个字节,因为该编码专用于阿拉伯语。例如,从Wikipedia article上的表中可以看到,字符“ح”(U + 062D)被编码为单字节“CD”。字符“ﻰ”(U + FEF0)被列为“阿拉伯语表示形式”,因此我想解释一下为什么它根本不在ISO 8859-6中出现(您不能以这种编码方式对该字符进行编码) 。
有两种非常常见的Unicode编码,可以对所有字符进行编码:UTF-8和UTF-16。它们的用途略有不同。 UTF-8使用1个字节表示ASCII字符,使用2到3个字节表示基本字符(包括所有阿拉伯语),使用4个字节表示其他字符。 UTF-16的基本字符使用2个字节,其他字符使用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个字节(除非您使用“表示形式”)。如果仅使用ASCII和阿拉伯字符,而没有其他用途,则可以使用ISO 8859-6,这样可以节省一些空间,但这通常是不值得的,因为一旦出现其他字符,它将立即中断。 UTF-8和UTF-16支持Unicode中的所有字符。
关于encoding - 我们需要多少个字节来存储阿拉伯字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4322191/