UTF-8、UTF-16和UTF-32之间有什么区别?
我知道它们都将存储Unicode,并且每个都使用不同的字节数来表示一个字符。选择一个比另一个有优势吗?
UTF-8、UTF-16和UTF-32之间有什么区别?
我知道它们都将存储Unicode,并且每个都使用不同的字节数来表示一个字符。选择一个比另一个有优势吗?
当前回答
简而言之:
UTF-8: Variable-width encoding, backwards compatible with ASCII. ASCII characters (U+0000 to U+007F) take 1 byte, code points U+0080 to U+07FF take 2 bytes, code points U+0800 to U+FFFF take 3 bytes, code points U+10000 to U+10FFFF take 4 bytes. Good for English text, not so good for Asian text. UTF-16: Variable-width encoding. Code points U+0000 to U+FFFF take 2 bytes, code points U+10000 to U+10FFFF take 4 bytes. Bad for English text, good for Asian text. UTF-32: Fixed-width encoding. All code points take four bytes. An enormous memory hog, but fast to operate on. Rarely used.
长:参见维基百科:UTF-8, UTF-16和UTF-32。
其他回答
简而言之,使用UTF-16或UTF-32的唯一原因是分别支持非英语和古代脚本。
我想知道为什么有人会选择非utf -8编码,因为它显然对web/编程更有效。
一个常见的误解-加后缀的数字不是它的能力的指示。它们都支持完整的Unicode,只是UTF-8可以用一个字节处理ASCII,所以对CPU和互联网来说更有效/更不容易损坏。
一些不错的阅读:http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.html 和http://utf8everywhere.org
Unicode是一个标准,关于UTF-x,你可以把它看作是一个技术实现,用于一些实际目的:
UTF-8 - "size optimized": best suited for Latin character based data (or ASCII), it takes only 1 byte per character but the size grows accordingly symbol variety (and in worst case could grow up to 6 bytes per character) UTF-16 - "balance": it takes minimum 2 bytes per character which is enough for existing set of the mainstream languages with having fixed size on it to ease character handling (but size is still variable and can grow up to 4 bytes per character) UTF-32 - "performance": allows using of simple algorithms as result of fixed size characters (4 bytes) but with memory disadvantage
简而言之:
UTF-8: Variable-width encoding, backwards compatible with ASCII. ASCII characters (U+0000 to U+007F) take 1 byte, code points U+0080 to U+07FF take 2 bytes, code points U+0800 to U+FFFF take 3 bytes, code points U+10000 to U+10FFFF take 4 bytes. Good for English text, not so good for Asian text. UTF-16: Variable-width encoding. Code points U+0000 to U+FFFF take 2 bytes, code points U+10000 to U+10FFFF take 4 bytes. Bad for English text, good for Asian text. UTF-32: Fixed-width encoding. All code points take four bytes. An enormous memory hog, but fast to operate on. Rarely used.
长:参见维基百科:UTF-8, UTF-16和UTF-32。
如前所述,差异主要在于底层变量的大小,在每种情况下,它们都会变大以允许表示更多字符。
然而,字体、编码和其他东西都非常复杂(没有必要?),所以需要一个大链接来填充更多细节:
http://www.cs.tut.fi/~jkorpela/chars.html#ascii
不要期望理解所有的东西,但是如果你不想在以后遇到问题,尽可能早地学习(或者让别人帮你整理)是值得的。
保罗。
Unicode定义了一个巨大的字符集,为每个图形符号分配一个唯一的整数值(这是一个主要的简化,实际上不是真的,但对于这个问题的目的来说已经足够接近了)。UTF-8/16/32只是编码的不同方式。
简而言之,UTF-32对每个字符使用32位值。这允许他们对每个字符使用固定宽度的代码。
UTF-16默认使用16位,但这只提供了65k个可能的字符,这远远不够完整的Unicode集。所以有些字符使用一对16位的值。
UTF-8默认使用8位值,这意味着前127个值是固定宽度的单字节字符(最高位用于表示这是多字节序列的开始,为实际的字符值留出7位)。所有其他字符编码为最多4个字节的序列(如果内存可用的话)。
这就引出了它的优点。任何ascii字符都与UTF-8直接兼容,因此对于升级遗留应用程序,UTF-8是一个常见而明显的选择。在几乎所有情况下,它也将使用最少的内存。另一方面,你不能保证字符的宽度。它可能是1、2、3或4个字符宽,这使得字符串操作困难。
UTF-32则相反,它使用最多的内存(每个字符都是固定的4字节宽),但另一方面,您知道每个字符都有这个精确的长度,因此字符串操作变得简单得多。您可以简单地根据字符串的字节长度计算字符串中的字符数。你不能用UTF-8这样做。
UTF-16是一种折衷。它让大多数字符适合固定宽度的16位值。所以只要你没有中文符号、音符或其他东西,你可以假设每个字符是16位宽。它比UTF-32使用更少的内存。但在某种程度上,这是“两败俱伤”。它几乎总是比UTF-8使用更多的内存,而且它仍然无法避免困扰UTF-8(变长字符)的问题。
最后,只使用平台支持的内容通常是有帮助的。Windows内部使用UTF-16,因此在Windows上,这是显而易见的选择。
Linux稍有不同,但它们通常使用UTF-8来处理所有与unicode兼容的内容。
简短的回答:所有三种编码都可以编码相同的字符集,但它们将每个字符表示为不同的字节序列。