在这样的陈述,其中两个将被输入到源代码与相同的编码(UTF-8)和语言环境设置不当,有它们之间的任何实际的差?
printf("ο Δικαιοπολις εν αγρω εστιν\n");
printf("%ls", L"ο Δικαιοπολις εν αγρω εστιν\n");
因此没有任何理由,更喜欢一个比其他做输出时? 我想象中的第二个执行公平有点差,但它有超过面值的多字节任何优势(或劣势)?
编辑:有与这些字符串印刷没有问题。 但我不使用宽字符串函数,因为我希望能够使用printf
等为好。 所以,问题是打印有什么不同(给定的情况如上文所述)的这些方式,如果是这样,那么第二个有什么优势?
EDIT2:按照下面的评论,我现在知道,这个程序的工作原理 - 我认为是不可能的:
int main()
{
setlocale(LC_ALL, "");
wprintf(L"ο Δικαιοπολις εν αγρω εστιν\n"); // wide output
freopen(NULL, "w", stdout); // lets me switch
printf("ο Δικαιοπολις εν αγρω εστιν\n"); // byte output
}
EDIT3:我已经通过看发生了什么事情有两种类型做了一些进一步的研究。 以一个简单的字符串:
wchar_t *wides = L"£100 π";
char *mbs = "£100 π";
编译器产生不同的代码。 宽字符串:
.string "\243"
.string ""
.string ""
.string "1"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string "0"
.string ""
.string ""
.string " "
.string ""
.string ""
.string "\300\003"
.string ""
.string ""
.string ""
.string ""
.string ""
而第二个是:
.string "\302\243100 \317\200"
看着那Unicode编码,二是简单的UTF-8。 宽字符表示是UTF-32。 我知道这将是实现相关的。
因此,也许文字的宽字符表示是更加便携? 我的系统将不直接打印UTF-16 / UTF-32编码,所以它被自动转换为UTF-8进行输出。