Visual Studio的字符集编码

时间:2019-06-13 19:41:06

标签: c++ windows visual-studio encoding character-encoding

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

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

1 个答案:

答案 0 :(得分:1)

Visual Studio C ++,支持:


字符串:

  • string:一种描述类型为basic_string的元素的模板类char的专业化类型
  • u16string:一种描述类型为basic_string的元素的模板类char16_t的特殊化类型。
  • u32string:一种描述类型为basic_string的元素的模板类char32_t的特殊化类型。
  • wstring:一种描述类型为basic_string的元素的模板类wchar_t的特殊化类型。

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


字符文字

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

https://docs.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字符文字的值将等于其ISO 10646代码点的值。控件和基本拉丁Unicode块)。如果该值不能由单个UTF-8代码单元表示,则程序格式错误。包含多个字符,转义序列或通用字符名称的UTF-8字符文字格式错误。

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

  • 以U前缀开头的字符文字是UTF-32字符文字。包含单个字符,转义序列或通用字符名称的UTF-32字符文字的值的值等于其ISO 10646代码点的值。包含多个字符,转义序列或通用字符名称的UTF-8字符文字格式错误。

https://docs.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
}