Character encoding 是否有任何理由不使用UTF-8、16等?

Character encoding 是否有任何理由不使用UTF-8、16等?,character-encoding,utf,Character Encoding,Utf,我知道最近web主要是针对UTF-8进行标准化,我只是想知道是否有任何地方使用UTF-8会是一件坏事。我听过这样的说法,UTF-8、16等可能会占用更多的空间,但最终它可以忽略不计 另外,在Windows程序、Linux shell和类似的东西中,你能安全地在那里使用UTF-8吗?当你需要编写一个速度非常快的程序(执行字符串操作)并且你确信不需要外来字符时,UTF-8可能不是最好的主意。在任何其他情况下,UTF-8都应该是标准 UTF-8在几乎所有最新的软件上都能很好地工作,即使在Windows

我知道最近web主要是针对UTF-8进行标准化,我只是想知道是否有任何地方使用UTF-8会是一件坏事。我听过这样的说法,UTF-8、16等可能会占用更多的空间,但最终它可以忽略不计


另外,在Windows程序、Linux shell和类似的东西中,你能安全地在那里使用UTF-8吗?

当你需要编写一个速度非常快的程序(执行字符串操作)并且你确信不需要外来字符时,UTF-8可能不是最好的主意。在任何其他情况下,UTF-8都应该是标准


UTF-8在几乎所有最新的软件上都能很好地工作,即使在Windows上也是如此。

如果UTF-32可用,则与其他版本相比,更倾向于使用UTF-8进行处理

如果您的平台本机支持UTF-32/UCS-4 Unicode,那么“压缩”版本UTF-8和UTF-16可能会慢一些,因为它们对每个字符(字符序列)使用不同的字节数,这使得无法按索引直接查找字符串,而UTF-32对每个字符使用32位“平坦”,大大加快了一些字符串操作


当然,如果您是在一个非常受限的环境(比如嵌入式系统)中编程,并且可以确定周围只有ASCII或ISO 8859-x字符,那么您可以选择这些字符集以提高效率和速度。但一般来说,请坚持使用Unicode转换格式。

众所周知,utf-8最适合文件存储和网络传输。但人们争论utf-16/32是否更适合处理。一个主要的论点是utf-16仍然是可变长度的,甚至utf-32也不是每个字符一个代码点,那么它们如何比utf-8更好呢?我认为utf-16是一个很好的折衷方案

首先,BMP外侧的字符在utf-16中需要双代码点,这些字符很少使用。这个范围内的汉字(还有其他一些亚洲汉字)基本上都是死字。普通人根本不会使用它们,除非专家使用它们来数字化古籍。因此,utf-32在大多数情况下都是一种浪费。不要太担心这些字符,因为如果你没有正确地处理它们,它们不会让你的软件看起来很糟糕,只要你的软件不适合那些特殊用户


其次,我们通常需要字符串内存分配与字符计数相关。e、 g.一个包含10个字符的数据库字符串列(假设我们以规范化的形式存储unicode字符串),对于utf-16,它将是20个字节。在大多数情况下,它将像那样工作,除了在极端情况下,它将只容纳5-8个字符。但对于utf-8,一个字符的公共字节长度对于西方语言是1-3,对于亚洲语言是3-5。这意味着即使对于普通情况,我们也需要10-50字节。更多的数据,更多的处理。

对于不支持UTF-8的现有协议,这是不使用UTF-8的一个很好的理由:)我个人只喜欢支持UTF-8编码,因为它允许unicode字符,同时允许我的生活围绕ASCII字符空间旋转(在“哑”编辑器中打开UTF-16内容会让我眼睛流血)@pst:B e c a u s e i t l o k s l i k e t h i s?好吧,你可以在Windows上编写基于UTF-8的软件(我已经完成了),但是你必须避免像
fopen
这样的函数使用“ANSI”字符串:-(什么?fopen?用什么语言?我是说在Windows上写基于UTF-8的软件是不可能的吗?我不明白你的意思。或者有人删除了他的评论。UTF-32对于相同的数据占用了ASCII(或编码ASCII字符时使用UTF-8)的4倍空间。这肯定很重要。另外,与“传统”不同像ISO-8859-*(和UTF-8不同)这样的字符集,UTF-32和UTF-16都有字节顺序的尾数问题。@dkarp:这就是我写“用于处理”的原因在第一个句子中,对于存储,您可能需要考虑存储格式或压缩,这取决于环境、组件的速度、访问字符串的频率和其他因素。仅在一个因素上很少进行优化。但是,主要的因素是,正如我所说的,平台支持。例如,使用UTF-1的Windows。6在我上次查看时,内部使用UTF-16将是最好的选择,将字符串操作优化留给平台/库提供商。@foo抱歉,但我不买它。如果您不想在UTF-32中输入,也不想在UTF-32中输出,也不想在内存中存储臃肿的UTF-32字符串,有什么好处?UTF-32甚至不是每32位一个字符/图形,而是每32位一个代码点。这是因为很少有平台和应用程序使用UTF-32,其好处通常不超过成本。@dkarp:关于代码点和字符之间的区别,您是正确的;但是,不同运行长度的问题仍然存在,包括缓存/访问速度方面。因此有赞成和反对的观点。从UTF-8/8位字符集的角度来看,你也可以称UTF-16为“臃肿”;然而,许多平台制造商决定采用它,可能在这里看到了最好的折衷——Java现在使用,Windows现在使用,Mac OS使用,Qt使用,可能还有更多的平台使用UTF-16。(显然接受字节顺序处理的必要性)。我不同意“不要太担心这些字符,因为如果你没有正确处理它们,它们不会让你的软件看起来很糟糕”。当你指“我的程序使用/支持UTF-16的子集”时说“我的程序使用/支持UTF-16”错误是一回事;故意不支持整个UTF-16不是一个错误。