打印UTF-8会产生不同的输出[重复]

Posted

技术标签:

【中文标题】打印UTF-8会产生不同的输出[重复]【英文标题】:printing UTF-8 yields different output [duplicate] 【发布时间】:2018-05-11 20:22:57 【问题描述】:

目标是使用 C++ 打印Uni Würzburg

我正在使用的代码:

#include <stdio.h>

using namespace std;

int main() 
    char str0[21] = "Uni Würzburg";
    printf("%s\n", str0);
    char str1[21] = 85,110,105,32,87,'\xc3','\xbc',114,122,98,117,114,103, 0;
    printf("%s\n", str1);
    char str2[20] = "Uni W\x81rzburg";
    printf("%s\n", str2);
    char str3[20] = 85,110,105,32,87,'\x81',114,122,98,117,114,103, 0;
    printf("%s\n", str3);
    return 0;

我通过创建"ü" 字符串并打印字符得到了\xc3bc

在两个不同的 Mac 上输出(同时使用 CLion 和在 bash 中使用 g++ test.c -o test):

Uni Würzburg
Uni Würzburg
Uni W�rzburg
Uni W�rzburg

Windows 上的输出 (CLion):

Uni W├╝rzburg
Uni W├╝rzburg
Uni Würzburg
Uni Würzburg

CLion 编辑器和项目编码在所有情况下都设置为 UTF-8,而 bash 的语言环境是:

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

为什么会这样?最重要的是:什么是独立于平台的解决方案?

【问题讨论】:

这是您要寻找的答案:***.com/a/402918/5470596 【参考方案1】:

有 unicode 文字可用于确保您的字符串被编码为 UTF-8:

u8"my_string"

在 Linux 上,这些普通字符串已经是 UTF-8。

在 Windows 上,这实际上取决于您的代码。 您还可以提供额外的编译器标志:/source-charset:utf-8

请注意,即使您的字符串在 Windows 上被编码为 UTF-8、cout,使用非 unicode 代码页打印到控制台也会得到错误的输出。

【讨论】:

以上是关于打印UTF-8会产生不同的输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Arrays.toString() 会给出与手动打印数组不同的输出? [关闭]

C:从 char 数组打印会产生错误字符

打印存储为字符串的十六进制值会产生意外的输出

条码流水号打印如何防止重复?

为啥打印和回声在“for”循环中表现不同[重复]

SAP打印机配置