对于主要包含阿拉伯文本的网页,我应该使用什么字符编码?
utf-8 可以吗?
UTF-8 可以存储完整的 Unicode 范围,因此可以用于阿拉伯语。
但是,如果您想知道哪种编码最有效:
所有阿拉伯字符都可以使用单个 UTF-16 代码单元(2 个字节)进行编码,但它们可能采用 2 个或 3 个 UTF-8 代码单元(每个 1 个字节),所以如果您只是对阿拉伯语进行编码,UTF-16 会成为更节省空间的选择。
但是,您不只是编码阿拉伯语 - 您正在编码大量字符,这些字符可以存储在 UTF-8 中的单个字节中,但在 UTF-16 中占用两个字节;所有 html 编码字符<
, &
,>
和=
所有 html 元素名称。
这是一种权衡,除非您要处理大量文件,否则这并不重要。
我主要开发阿拉伯语网站,这是我使用的两种编码:
这是阿拉伯语网站最常用的编码。它在大多数情况下(90%)适用于阿拉伯语用户。
这是最大的阿拉伯语网络开发论坛之一: http: //traidnt.net/vb/。您可以看到他们正在使用这种编码。
这种编码的问题在于,如果您正在开发一个供国际使用的网站,则这种编码不适用于每个用户,他们会看到乱码而不是内容。
这种编码解决了前面的问题,也适用于 url。我的意思是如果你想在你的 url 中包含阿拉伯语单词,你需要它们在 utf-8 中,否则它将不起作用。
这种编码的缺点是,如果您要使用这种编码将阿拉伯语内容保存到数据库(例如 MySql)(因此数据库也将使用 utf-8 编码),它的大小将是原来的两倍如果它是用 windows-1256 编码的(所以数据库将用 latin-1 编码)。
如果你能负担得起大小的增加,我建议使用 utf-8。
UTF-8 很好,是的。它可以对 Unicode 标准中的任何代码点进行编码。
编辑添加
为了使答案更完整,您的现实选择是:
每个都有权衡和优势。
正如Joe Gauterin 所指出的,UTF-8 对于欧洲文本来说非常有效,但如果你得到的拉丁字母“越远”,它的效率就会越来越低。如果您的文本全是阿拉伯语,它实际上会比 UTF-16 中的等效文本大。然而,这在实践中很少会成为问题,除非您有大量的文本要处理,否则在这些廉价且充足的 RAM 的日子里。更多的问题是编码的可变长度使一些字符串操作变得困难和缓慢。例如,您不能轻易地获得字符串中的第五个阿拉伯字符,因为某些字符可能是 1 个字节长(例如标点符号),而其他字符可能是两个或三个。这使得字符串的实际处理速度变慢并且容易出错。
另一方面,如果您要处理大量混合的欧洲/阿拉伯文本,UTF-8 可能是您的最佳选择。文档中的欧洲文本越多,UTF-8 选择就越好。
如果您主要使用阿拉伯语文本,则 UTF-16 将比 UTF-8 提供更好的空间效率。但是,我不知道阿拉伯语代码点,所以我不知道您是否有可能在这里使用可变长度编码。(不过,我的猜测是这不是问题。)如果您确实有可变长度编码,那么 UTF-8 的所有字符串处理问题也适用于此。如果没有,没有问题。
另一方面,如果您混合了欧洲和阿拉伯文本,UTF-16 的空间效率会降低。此外,如果您发现自己将文本表单扩展到其他文本,例如中文,您肯定会回到可变长度表单和相关问题。
UTF-32 基本上会使您的空间需求翻倍。另一方面,对于所有已知(并且可能未知;)脚本形式,它的大小都是恒定的。对于原始字符串处理,它是您最快、最好的选择,没有可变长度编码会给您带来的问题。(这假设您有一个字符串库,自然知道 32 位字符。)
我自己的建议是您使用 UTF-8 作为您的外部格式(因为每个人都支持它)用于存储、传输等,除非您真的看到 UTF-16 在大小方面的好处。因此,无论何时您从外部世界读取一个字符串,它都会是 UTF-8,而任何时候您将一个字符串放到外部世界,它也会是 UTF-8。但是,在您的软件中,除非您有操作大量字符串的习惯(在这种情况下,无论如何我都会推荐不同的数据结构!)我建议您改用 UTF-16 或 UTF-32(取决于是否有UTF-16 数据中的可变长度编码问题)以提高速度效率和简化代码。
UTF-8 是最简单的方法,因为它几乎适用于所有内容:
UTF-8 可以编码任何 Unicode 字符。无需选择正确的代码页或字体即可正确显示不同语言的文件。例如中文和阿拉伯文可以在同一文本中,无需插入特殊代码来切换编码。(通过维基百科)
当然要记住:
UTF-8 通常比为一种或几种语言制作的编码占用更多空间。带有变音符号的拉丁字母和来自其他字母脚本的字符通常在适当的多字节编码中每个字符占用一个字节,但在 UTF-8 中占用两个字节。东亚文字在其多字节编码中通常每个字符有两个字节,但在 UTF-8 中每个字符需要三个字节。
...但在大多数情况下,这不是一个大问题。如果您开始处理大量文档,它将成为一个。
UTF-8 通常比为一种或几种语言制作的编码占用更多空间。带有变音符号的拉丁字母和来自其他字母脚本的字符通常在适当的多字节编码中每个字符占用一个字节,但在 UTF-8 中占用两个字节。东亚文字在其多字节编码中通常每个字符有两个字节,但在 UTF-8 中每个字符需要三个字节。