【问题标题】:What is a multibyte character set?什么是多字节字符集?
【发布时间】:2010-10-19 10:28:49
【问题描述】:

术语多字节是指一个字符集,其字符可以(但不必)宽于 1 个字节(例如 UTF-8),还是指在任何情况下都宽于 1 个字节的字符集(例如 UTF-16)?换句话说:如果有人谈论多字节字符集是什么意思?

【问题讨论】:

    标签: utf-8 terminology multibyte


    【解决方案1】:

    该术语含糊不清,但在我的国际化工作中,我们通常避免使用术语“多字节字符集”来指代基于 Unicode 的编码。通常,我们仅将这个术语用于具有一个或多个字节来定义每个字符的传统编码方案(不包括每个字符只需要一个字节的编码)。

    通常包括 Shift-jis、jis、euc-jp、euc-kr 以及中文编码。

    大多数遗留编码,除了一些例外,需要一种状态机模型(或更简单地说,页面交换模型)来处理,并且在文本流中向后移动是复杂且容易出错的。 UTF-8 和 UTF-16 不会遇到这个问题,因为 UTF-8 可以使用位掩码进行测试,而 UTF-16 可以针对一系列代理对进行测试,因此在非病态文档中前后移动可以安全地完成,没有很大的复杂性。

    一些传统编码,如泰语和越南语,具有多字节字符集的一些复杂性,但实际上只是建立在组合字符之上,通常不与广义术语“多字节”混为一谈。

    【讨论】:

      【解决方案2】:

      如果有人谈论多字节字符集是什么意思?

      像往常一样,这取决于谁在说话!

      从逻辑上讲,它应该包括 UTF-8、Shift-JIS、GB 等:可变长度编码。在这个组中通常不会考虑 UTF-16(尽管它有点像,代理项是什么;当通过 UTF-16LE/UTF-16BE 编码成字节时肯定是多个字节)。

      但在 Microsoftland 中,该术语更典型地用于表示可变长度的默认系统代码页(对于遗留的非 Unicode 应用程序,遗憾的是仍然有很多)。在这种用法中,不能包含 UTF-8 和 UTF-16LE/UTF-16BE,因为 Windows 上的系统代码页不能设置为这两种编码中的任何一种。

      确实,在某些情况下,“mbcs”只不过是系统代码页的同义词,也称为“ANSI”(甚至更容易引起误解)。在这种情况下,“多字节”字符集实际上可能像 cp1252 西欧那样微不足道,每个字符只使用一个字节!

      我的建议:当你有这个意思时使用“可变长度”,并避免使用含糊不清的术语“多字节”;当其他人使用它时,您需要要求澄清,但通常具有 Windows 背景的人会谈论像 cp932 (Shift-JIS) 这样的传统东亚代码页,而不是 UTF。

      【讨论】:

        【解决方案3】:

        您没有 1 字节 = 1 字符映射的所有字符集。所有 Unicode 变体,还有亚洲字符集都是多字节的。

        更多信息,我建议阅读this Wikipedia article

        【讨论】:

          【解决方案4】:

          多字节字符表示其编码需要超过 1 个字节的字符。然而,这并不意味着使用该特定编码的所有字符都将具有相同的宽度(以字节计)。例如:UTF-8 和 UTF-16 编码的字符有时可能使用多个字节,而 all UTF-32 编码的字符总是使用 32 位。

          参考资料:

          【讨论】:

          • @DanielW。 Microsoft 链接已更新。
          【解决方案5】:

          通常是前者,即类 UTF-8。如需更多信息,请参阅Variable-width encoding

          【讨论】:

            【解决方案6】:

            前者 - 尽管术语“可变长度编码”更合适。

            【讨论】:

              【解决方案7】:

              我通常用它来指代可以每个字符有多个字节的任何字符。

              【讨论】:

                【解决方案8】:

                一个多字节字符集可以由一个字节和两个字节组成 人物。因此,多字节字符串可能包含以下混合 单字节和双字节字符。

                参考:Single-Byte and Multibyte Character Sets

                【讨论】:

                  【解决方案9】:

                  UTF-8 是多字节的,这意味着每个英文字符(ASCII)存储在 1 个字节中,而非英文字符(如中文、泰文)存储在 3 个字节中。当您将中文/泰文与英文混合时,例如“ทt”,第一个泰文字符“ท”使用 3 个字节,而第二个英文字符“t”仅使用 1 个字节。设计多字节编码的人意识到,英文字符不应该存储在 3 个字节中,而可以放在 1 个字节中,因为这样会浪费存储空间。

                  UTF-16 以固定的 2 字节长度存储每个英文或非英文字符,因此它不是多字节而是称为宽字符。它非常适合每个字符完全适合 2 个字节的中文/泰语语言,但打印到 utf-8 控制台输出需要使用函数 wcstombs() 从宽字符转换为多字节格式。

                  UTF-32 以固定的 4 字节长度存储每个字符,但由于浪费存储空间,没有人使用它来存储字符。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-07-18
                    • 2019-06-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-17
                    • 2013-07-02
                    相关资源
                    最近更新 更多