【问题标题】:Is multibyte character set encoding different than utf8? [closed]多字节字符集编码与 utf8 不同吗? [关闭]
【发布时间】:2022-01-02 13:34:57
【问题描述】:

我对 unicode 进行了大量阅读,得出的结论是 Unicode 是一个字符集,而 utf8 是可能的编码之一,恰好是多字节编码。 然而,当我被告知我的 Windows 机器可能具有与 utf8 不同的语言环境设置时,进一步的阅读让我有点困惑。

  1. 如果我的应用程序处理 utf8,那么我需要先从多字节用户输入转换为宽字符,然后再转换为 utf8。我的第一个问题是为什么我需要这样做,因为 utf8 本身就是多字节编码。那么,为什么我需要进行此往返行程?
  2. 我的第二个问题是如何在 Windows 和 Linux 中获取当前语言环境?为什么这种语言环境的讨论甚至存在?我的意思是为什么我们在编写一个支持 unicode 的 c++ 应用程序时甚至需要考虑语言环境设置?
  3. 我的第三个问题是,应用程序内部处理的utf8与保存应用程序源文件的编码有何不同?应用程序正在处理的编码(在我的例子中为 utf8)与保存应用程序源代码的编码之间是否存在任何关系?
  4. 我的第四个问题是,当我们说应用程序支持 Unicode 时,它​​的实际含义是什么?这是否意味着它应该处理所有可能的 Unicode 编码或特定的编码?给定一个应用程序,我如何才能知道它支持哪种 unicode 编码?

【问题讨论】:

    标签: c++ unicode utf-8 c++17


    【解决方案1】:

    多字节字符集编码与 utf8 不同吗?

    UTF-8 是多字节字符集,但也存在其他多字节字符集。

    如果我的应用程序处理 utf8,那么我需要先从多字节用户输入转换为宽字符,然后再转换为 utf8。我的第一个问题是为什么我需要这样做

    您通常不需要这样做。如果您有需要这样做的情况,那么原因取决于该情况。

    如何在 Windows 和 Linux 中获取当前语言环境?

    您可以使用std::setlocale 函数。如果您将 null 作为第二个参数传递,它会返回作为第一个参数给出的类别的语言环境。

    在 POSIX 系统上,您可以使用 nl_langinfo 函数来获取给定语言环境的字符编码。

    为什么这种关于语言环境的讨论甚至存在?

    因为存在不同的编码、语言和约定。

    我的意思是为什么我们在编写一个支持 unicode 的 c++ 应用程序时甚至需要考虑区域设置?

    首先,除了unicode之外还有其他的编码。如果没有 locale,你就无法知道当前的编码是否是 unicode。

    其次,语言环境不仅仅包含编码。最重要的是,它涵盖了系统的语言。它还涵盖了诸如使用什么符号作为小数分隔符之类的内容。

    【讨论】:

    • 那么你的意思是带有 null 参数的 setlocale 会告诉我正在使用什么编码,即输入数据的编码?这会和 windows 的代码页一样吗?
    • @Test So did you mean that setlocale with null argument will tell me what encoding is in use 是的。 i.e the encoding of the input data? 如果输入数据来自区域设置感知函数,那么是的。例如,如果输入来自文件系统,那么它可以有不同的编码。 Will this be same as the codepage for windows? 据我了解,Windows 代码页是字符编码。如果当前编码是代码页之一,那就是它。如果不是,那就是别的东西。
    • 谢谢。如果输入来自 Windows 控制台或来自 Windows 硬盘上的文件,如何找到编码?另外,您没有回答原始问题中第 4 点的问题?
    • @Test How to find the encoding if the input is from windows console 我对windows了解不多,但我认为它是系统编码。 OR from a file on hard disk 你只需要知道创建文件时使用了什么编码。有一些技术可以猜测编码,但任何这样的技巧都很有可能猜错。
    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多