【问题标题】:printing UTF-8 yields different output [duplicate]打印UTF-8会产生不同的输出[重复]
【发布时间】:2023-06-10 17:26:01
【问题描述】:

目标是使用 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=

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

【问题讨论】:

标签: c++ windows macos


【解决方案1】:

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

u8"my_string"

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

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

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

【讨论】:

    最近更新 更多