我应该为主要包含阿拉伯文本的网页使用什么字符编码?utf-8好吗?

Pau*_*ite 14 html unicode utf-8 arabic internationalization

我应该为主要包含阿拉伯文本的网页使用什么字符编码?

utf-8好吗?

Joe*_*oeG 16

UTF-8可以存储完整的Unicode范围,因此可以用于阿拉伯语.


但是,如果您想知道哪种编码最有效:

所有阿拉伯字符都可以使用单个UTF-16代码单元(2个字节)进行编码,但它们可以采用2个或3个UTF-8代码单元(每个1个字节),因此如果您只是编码阿拉伯语,UTF-16会是一个更节省空间的选择.

但是,您不只是编码阿拉伯语 - 您编码的大量字符可以存储在UTF-8中的单个字节中,但在UTF-16中占用两个字节; 所有的HTML编码字符<,&,>,=和所有的HTML元素名称.

这是一种权衡,除非你处理大量文件,否则无所谓.

  • 你提出的第二部分经常被忽视.值得一个具体的例子 - 这是来自维基百科的一个例子:`"字符U + 0800到U + FFFF使用UTF-8中的三个字节,但只使用UTF-16中的两个字节.因此,文本(例如)中文,日文如果这些字符多于ASCII字符,那么印地语可以在UTF-8中占用更多空间.这在真实文档中很少发生,例如维基百科上的日文和韩文UTF-8文章如果保存为UTF-16比原始的UTF-8版本."`(虽然我将其解释为*HTML*文档.) (3认同)

Mah*_*ver 10

我主要开发阿拉伯语网站,这些是我使用的两种编码:

1. Windows-1256

这是阿拉伯语网站最常用的编码方式.它在大多数情况下(90%)适用于阿拉伯语用户.

这是最大的阿拉伯网络发展论坛之一:http://traidnt.net/vb/.您可以看到他们正在使用此编码.

这种编码的问题在于,如果您正在开发一个供国际使用的网站,这种编码将不适用于每个用户,他们将看到乱码而不是内容.

2. UTF-8

此编码解决了以前的问题,也适用于网址.我的意思是如果你想在你的网址中有阿拉伯语单词,你需要它们在utf-8中,否则它将无效.

这种编码的缺点是如果你要使用这种编码将阿拉伯语内容保存到数据库(例如MySql)(因此数据库也将用utf-8编码),它的大小将是原来的两倍.如果它是用windows-1256编码的(所以数据库将用latin-1编码).

如果你能负担得起规模的增加,我建议你选择utf-8.


JUS*_*ION 8

UTF-8很好,是的.它可以编码Unicode标准中的任何代码点.


编辑添加

为了使答案更加完整,您的现实选择是:

  • UTF-8
  • UTF-16
  • UTF-32

每个都有权衡和优势.

UTF-8

正如Joe Gauterin指出的那样,UTF-8对于欧洲文本来说非常有效,但是从你得到的拉丁字母"越远"越来越低效.如果您的文本都是阿拉伯语,那么它实际上将大于UTF-16中的等效文本.然而,在这些日子里,除了你需要处理大量文本之外,在廉价和丰富的RAM中,这几乎不是问题.更多的问题是编码的可变长度使得一些字符串操作变得困难和缓慢.例如,你不能轻易地在字符串中获得第五个阿拉伯字符,因为某些字符可能是1个字节长(比如标点符号),而其他字符则是两个或三个.这使得字符串的实际处理变得缓慢且容易出错.

另一方面,如果您正在进行大量混合的欧洲/阿拉伯语文本,UTF-8可能是您的最佳选择.文档中的欧洲文本越多,UTF-8的选择就越好.

UTF-16

如果您主要使用阿拉伯语文本,UTF-16将为您提供比UTF-8更好的空间效率.但是,我不知道阿拉伯语代码点,所以我不知道你是否有可能在这里使用可变长度编码.(我的猜测是,这不是问题.)如果你确实有可变长度编码,那么UTF-8的所有字符串处理问题也适用于此.如果没有,没问题.

另一方面,如果你有欧洲和阿拉伯语混合文本,UTF-16的节省空间会更少.此外,如果您发现自己将文本表单扩展到其他文本,例如中文,您肯定会回到可变长度表单和相关问题.

UTF-32

UTF-32基本上会使您的空间需求翻倍.另一方面,对于所有已知(并且可能是未知的)脚本形式,它的大小不变.对于原始字符串处理,它是您最快,最好的选择,没有可变长度编码会导致您的问题.(这预示着你有一个自然知道32位字符的字符串库.)

建议

我自己的建议是你使用UTF-8作为外部格式(因为每个人都支持它)用于存储,传输等,除非你真的看到UTF-16的大小优势.因此,每当你从外部世界读取一个字符串时,它将是UTF-8,每当你把它放到外面的世界时,它也将是UTF-8.但是,在你的软件中,除非你习惯于操作大量的字符串(在这种情况下我还是会推荐不同的数据结构!)我建议使用UTF-16或UTF-32(取决于是否有任何数据结构) UTF-16数据中的可变长度编码问题,以提高代码的速度和简单性.