Visual Studio 的字符集编码

Character Set Encoding of Visual Studio

本文关键字:编码 字符集 Studio Visual      更新时间:2023-10-16

当我们使用字符序列编码时,我们有不同类型的编码标准,如单字节编码标准(ASCII和扩展ASCII),多字节编码标准(Shift-JIS,Unicode 16和...)以及Unicode 32标准,它在今天的编程和软件开发中很突出,但在Visual Studio环境中,我们只有多字节编码和Unicode。

我的问题是:我应该如何在Visual Studio环境中使用可变长度编码标准?它是否支持这些类型的编码标准?如果是,我如何在视觉工作室甚至其他环境中使用它来实现学习目标?例如,我们如何在Microsoft Visual Studio环境中使用UCS 2或UTF16编码进行C++开发?

Visual Studio C++,支持:

>字符串:
  • string:描述具有类型char元素的模板类basic_string的专用化的类型
  • u16string:描述具有类型为char16_t的元素的模板类basic_string专用化的类型。
  • u32string:描述具有类型为char32_t的元素的模板类basic_string专用化的类型。
  • wstring:描述具有类型为wchar_t的元素的模板类basic_string专用化的类型。

https://learn.microsoft.com/en-us/cpp/standard-library/string-typedefs?view=vs-2019


字符文字

  • 类型为char的普通字符文字,例如'a'
  • 类型char的 UTF-8 字符文本,例如u8'a'
  • 类型wchar_t的宽字符文本,例如L'a'
  • 类型的 UTF-16 字符文字char16_t,例如u'a'
  • UTF-32 字符文字类型为char32_t,例如U'a'

https://learn.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=vs-2019#character-literals

<小时 />

编码:

  • 没有前缀的字符文本是普通字符文本。包含可在执行字符集中表示的单个字符、转义序列或通用字符名称的普通字符文本的值的值等于其在执行字符集中的编码数值。包含多个字符、转义序列或通用字符名称的普通字符文本是多字符文本。无法在执行字符集中表示的多字符文本或普通字符文本受条件支持,具有 int 类型,并且其值由实现定义。

  • L前缀开头的字符文本是宽字符文本。包含单个字符、转义序列或通用字符名称的宽字符文本的值的值等于其在执行宽字符集中的编码的数值,除非字符文本在执行宽字符集中没有表示形式,在这种情况下,该值是实现定义的。包含多个字符、转义序列或通用字符名称的宽字符文本的值是实现定义的。

  • u8前缀开头的字符文本是UTF-8 字符文本。如果包含单个字符、转义序列或通用字符名称的 UTF-8 字符文本的值可以由单个 UTF-8 代码单元(对应于 C0 控件和基本拉丁语 Unicode 块)表示,则该值的值等于其 ISO 10646 码位值。如果该值不能由单个 UTF-8 代码单元表示,则程序格式不正确。包含多个字符、转义序列或通用字符名称的 UTF-8 字符文本格式不正确。

  • u前缀开头的字符文本是UTF-16 字符文本。包含单个字符、转义序列或通用字符名称的 UTF-16 字符文本的值的值等于其 ISO 10646 码位值(如果可以用单个 UTF-16 码单元(对应于基本多语言平面)表示。如果该值不能由单个 UTF-16 代码单元表示,则程序格式不正确。包含多个字符、转义序列或通用字符名称的 UTF-16 字符文本格式不正确。

  • U前缀开头的字符文本是UTF-32 字符文本。包含单个字符、转义序列或通用字符名称的 UTF-32 字符文本的值等于其 ISO 10646 码位值。包含多个字符、转义序列或通用字符名称的 UTF-8 字符文本格式不正确。

https://learn.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=vs-2019#encoding

<小时 />
#include <string>
using namespace std::string_literals; // enables s-suffix for std::string literals
int main()
{
// Character literals
auto c0 =   'A'; // char
auto c1 = u8'A'; // char
auto c2 =  L'A'; // wchar_t
auto c3 =  u'A'; // char16_t
auto c4 =  U'A'; // char32_t
// String literals
auto s0 =   "hello"; // const char*
auto s1 = u8"hello"; // const char*, encoded as UTF-8
auto s2 =  L"hello"; // const wchar_t*
auto s3 =  u"hello"; // const char16_t*, encoded as UTF-16
auto s4 =  U"hello"; // const char32_t*, encoded as UTF-32
// Raw string literals containing unescaped  and "
auto R0 =   R"("Hello  world")"; // const char*
auto R1 = u8R"("Hello  world")"; // const char*, encoded as UTF-8
auto R2 =  LR"("Hello  world")"; // const wchar_t*
auto R3 =  uR"("Hello  world")"; // const char16_t*, encoded as UTF-16
auto R4 =  UR"("Hello  world")"; // const char32_t*, encoded as UTF-32
// Combining string literals with standard s-suffix
auto S0 =   "hello"s; // std::string
auto S1 = u8"hello"s; // std::string
auto S2 =  L"hello"s; // std::wstring
auto S3 =  u"hello"s; // std::u16string
auto S4 =  U"hello"s; // std::u32string
// Combining raw string literals with standard s-suffix
auto S5 =   R"("Hello  world")"s; // std::string from a raw const char*
auto S6 = u8R"("Hello  world")"s; // std::string from a raw const char*, encoded as UTF-8
auto S7 =  LR"("Hello  world")"s; // std::wstring from a raw const wchar_t*
auto S8 =  uR"("Hello  world")"s; // std::u16string from a raw const char16_t*, encoded as UTF-16
auto S9 =  UR"("Hello  world")"s; // std::u32string from a raw const char32_t*, encoded as UTF-32
}