在这些语句中,两者都使用相同的编码(UTF-8)输入到源代码中并且语言环境设置正确,它们之间是否存在实际差异?
printf("? ??????????? ?? ???? ?????\n");
printf("%ls", L"? ??????????? ?? ???? ?????\n");
Run Code Online (Sandbox Code Playgroud)
因此有什么理由在做输出时更喜欢一个而不是另一个?我想第二个表现得差一点,但是它对多字节文字有任何优势(或劣势)吗?
编辑:这些字符串打印没有问题.但是我没有使用宽字符串函数,因为我也希望能够使用printf等等.所以问题是打印任何不同的方式(鉴于上面列出的情况),如果是这样,第二个方法有任何优势吗?
编辑2:按照下面的评论,我现在知道这个程序有效 - 我认为这是不可能的:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"? ??????????? ?? ???? ?????\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("? ??????????? ?? ???? ?????\n"); // byte output
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:我通过观察这两种类型的情况做了一些进一步的研究.拿一个更简单的字符串:
wchar_t *wides = L"£100 ?";
char *mbs = "£100 ?";
Run Code Online (Sandbox Code Playgroud)
编译器生成不同的代码.宽字符串是:
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string …Run Code Online (Sandbox Code Playgroud) 我知道C字符串是char [],在最后一个元素中带有'\ 0'.但是这些字符是如何编码的?
更新:我发现这个很酷的链接谈论了许多其他编程语言及其编码约定:链接