Visual Studio 的字符集编码
Posted
技术标签:
【中文标题】Visual Studio 的字符集编码【英文标题】:Character Set Encoding of Visual Studio 【发布时间】:2019-06-13 19:41:06 【问题描述】:当我们使用字符序列编码时,我们有不同类型的编码标准,例如单字节编码标准(ASCII 和扩展 ASCII)、多字节编码标准(Shift-JIS、Unicode 16 和 ...)以及 Unicode 32 个标准,在当今的编程和软件开发中很突出,但在 Visual Studio 环境中,我们只有多字节编码和 Unicode。
我的问题是:我应该如何在 Visual Studio 环境中使用可变长度编码标准?它是否支持这些类型的编码标准?如果是,我如何在视觉工作室甚至其他环境中使用它来实现学习目标?例如,我们如何在 Microsoft Visual Studio 环境中使用 UCS 2 或 UTF16 编码进行 C++ 开发?
【问题讨论】:
UCS-2 早已不复存在(随着 Windows-NT 的淘汰)。 MS-Windows 是原生的 UTF-16LE(注意这是可变长度),它被 Visual Studio 完全支持,并且在新项目中默认启用(并且已经有一段时间了)。 @RichardCritten 如何在 Visual Studio 环境中使用 UTF-16LE?即如何用这种编码而不是 ascii 声明一个数组字符串?std::wstring
应该可以工作。它被定义为std::basic_string<wchar_t>
和wchar_t
s 与W
版本的WinAPI 一起使用。
【参考方案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 代码单元表示(对应于 C0控件和基本拉丁语 Unicode 块)。如果该值不能由单个 UTF-8 代码单元表示,则程序格式错误。包含多个字符、转义序列或通用字符名称的 UTF-8 字符文字格式不正确。
以u
前缀开头的字符文字是UTF-16 字符文字。包含单个字符、转义序列或通用字符名称的 UTF-16 字符文字的值如果可以由单个 UTF-16 代码单元表示(对应于基本多语言平面)。如果该值不能由单个 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
【讨论】:
以上是关于Visual Studio 的字符集编码的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio Code 1.44 解决中文代码显示乱码问题(小白图文教程)
转: 带你玩转Visual Studio——带你理解多字节编码与Unicode码