可以使用UTF-8对ASCII中的所有字符进行编码,而无需增加存储量(两者都需要存储一个字节)。
UTF-8除了“ ASCII字符”之外,还具有字符支持的优点。如果是这样的话,为什么我们会永远选择了UTF-8 ASCII编码?
当我们选择ASCII而不是UTF-8时,是否存在用例?
可以使用UTF-8对ASCII中的所有字符进行编码,而无需增加存储量(两者都需要存储一个字节)。
UTF-8除了“ ASCII字符”之外,还具有字符支持的优点。如果是这样的话,为什么我们会永远选择了UTF-8 ASCII编码?
当我们选择ASCII而不是UTF-8时,是否存在用例?
Answers:
在某些情况下,它可以加快对单个字符的访问。想象一下str='ABC'
以UTF8和ASCII编码的字符串(并假设语言/编译器/数据库知道编码)
要C
使用数组访问操作符访问此字符串的第三个()字符(许多编程语言均提供该功能),您可以执行c = str[2]
。
现在,如果字符串是ASCII编码的,我们要做的就是从字符串中提取第三个字节。
但是,如果字符串是UTF-8编码的,则必须首先检查第一个字符是一个还是两个字节的字符,然后我们需要对第二个字符执行相同的检查,然后才能访问第三个字符。性能差异越大,字符串越长。
例如,在某些数据库引擎中,这是一个问题,在其中查找位于UTF-8编码的VARCHAR之后的列的开头,数据库不仅需要检查VARCHAR字段中有多少个字符,还需要检查它们每个使用许多字节。
如果只使用UTF-8的US-ASCII(或ISO 646)子集,那么另一个就没有真正的优势。实际上,所有内容都被相同地编码。
如果您不打算使用US-ASCII字符集,而是使用(例如)带有典型西欧语言中的重音符号,变音符号等字符,则有区别-大多数仍然可以在ISO 8859中使用单个字节编码,但是在UTF-8中编码时将需要两个或更多字节。当然也有缺点:ISO 8859要求您使用一些带外方法来指定所使用的编码,并且它仅支持一种一次使用这些语言。例如,您可以仅使用一个字节来对西里尔字母(俄语,白俄罗斯语等)的所有字符进行编码,但是如果您需要/想要将它们与法语或西班牙语字符混合(除了US-ASCII中的字符) / ISO 646子集),您几乎是不走运的-您必须完全更改字符集才能做到这一点。
ISO 8859实际上仅对欧洲字母有用。为了支持大多数中文,日文,韩文,阿拉伯文等字母中使用的大多数字母,您必须使用一些完全不同的编码。其中一些(例如,日语的Shift JIS)是绝对难以处理的。如果您有机会支持它们,我认为使用Unicode是值得的,以防万一。
ANSI可以是很多东西,在这方面大多数是8位字符集(例如Windows下的代码页1252)。
也许您在考虑ASCII,它是7位并且是UTF-8的适当子集。即,任何有效的ASCII流也都是有效的UTF-8流。
如果您考虑使用8位字符集,那么一个非常重要的优点是,所有可表示的字符都恰好是8位,而在UTF-8中,它们最多可以是24位。
是的,在某些情况下,ASCII是有意义的:文件格式和网络协议。特别是用于以下场合:
通过使用ASCII作为编码,您可以避免多字节编码的复杂性,同时至少保留了一些人类可读性。
几个例子:
IDAT
意味着“图像数据”和PLTE
“调色板”是很方便的。当然,您需要注意,确实不会将数据呈现给最终用户,因为如果最终看不到数据(例如在URL的情况下),那么用户理所当然会期望该数据能够被显示出来。他们可以阅读的语言。
首先:标题使用/ d ANSI,而在文本中则引用ASCII。请注意,ANSI不等于ASCII。ANSI包含ASCII集。但是ASCII集仅限于前128个数字值(0-127)。
如果所有数据都限制为ASCII(7位),则使用UTF-8,ANSI还是ASCII都没有关系,因为ANSI和UTF-8都包含了完整的ASCII集。换句话说:0到127之间的数字值表示ASCII,ANSI和UTF-8中完全相同的字符。
如果您需要ASCII字符集以外的字符,则需要选择一种编码。您可以使用ANSI,但随后会遇到所有不同代码页的问题。如果将这些机器设置为使用不同的代码页,则在机器A上创建文件并在机器B上读取文件可能会产生有趣的文本,这很简单,因为数值nnn表示这些代码页中的不同字符。
此“代码页地狱”是定义Unicode标准的原因。UTF-8只是该标准的单一编码,还有更多。UTF-16是最广泛使用的,因为它是Windows的本机编码。
因此,如果您需要支持ASCII集的128个字符以外的任何字符,我的建议是使用UTF-8。这样就没关系,您不必担心用户使用哪个代码页设置了系统。