我想用UTF-8打印blå,但我不知道怎么做.b的UTF-8是62,l是6C,å是C3A5.我不确定该怎么处理å个角色.以下是我的代码:

#include <stdio.h>

int main(void) {

    char myChar1 = 0x62;  //b
    char myChar2 = 0x6C;  //l
    char myChar3 = ??     //å

    printf("%c", myChar1);
    printf("%c", myChar2);
    printf("%c", myChar3);

    return 0;
}

我还try 了这个:

#include <stdio.h>

#define SIZE 100

int main(void) {

    char myWord[SIZE] = "\x62\x6c\xc3\xa5\x00";

    printf("%s", myWord);

    return 0;
}

但是,输出结果是:

blå

最后,我try 了一下:

#include <stdio.h>
#include <locale.h>

#define SIZE 100

int main(void) {

    setlocale(LC_ALL, ".UTF8");
    char myWord[SIZE] = "\x62\x6c\xc3\xa5\x00";

    printf("%s", myWord);

    return 0;
}

输出与以前相同.

我不确定我是否完全理解Unicode.如果我理解正确的话,UTF-16和UTF-32使用宽字符,其中每个字符需要相同数量的字节(UTF-16为2或4).另一方面,UTF-8使用宽字符,其中大小可能有所不同(1-4字节).我知道前128个字符需要1个字节,几乎所有的拉丁文-1都可以用2个字节来描述,等等.因为UTF-8不需要宽字符,所以我不需要在代码中使用wchar函数.因此,我不明白为什么我的第二个和/或第三个代码不能工作.我唯一的解决方案是包含setmode来更改stdinstdout的编码,尽管我不确定这是否可行,也不确定如何实现它.

摘要:

为什么我的代码不起作用?

我在WINDOWS和VScode上,有MINGW32作为编译器.

推荐答案

您的第二次try 是正确的,并且如您所希望的那样输出UTF-8.问题是您的终端不显示UTF-8.有关在Windows终端上显示UTF-8的讨论,请参见Displaying Unicode in PowerShellUsing UTF-8 Encoding (CHCP 65001) in Command Prompt / Windows Powershell (Windows 10).

您当前的配置是0xc3编码├的配置,可能是CP850,我认为这是一些基于mingw的终端(MSY、GIT bash)的默认配置.我已经很久没有用过mingw了,但你可能也想看看How to set console encoding in MSYS?

C++相关问答推荐

有没有更简单的方法从用户那里获取数据类型来计算结果

增加getaddrinfo返回的IP地址数量

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

我可以在C中声明不同长度数组的数组而不带变量名吗?

C语言编译阶段与翻译阶段的关系

为什么该函数不将参数值保存到数据 struct 中?

为什么我不能只在内存地址中添加一个int来寻址任何数组?

实现简单字典时C语言中的段错误

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

在C中访问数组中的特定值

使用nmake for程序比Hello World稍微复杂一些

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

传递给函数的 struct 中的数组

Malloc和对齐

UpDown控制与预期相反

即使客户端不发送数据,也会发生UNIX套接字读取

为什么INT_MIN是在c语言的头文件limits.h中定义的(-INT_MAX-1)而不是直接使用-2147483648

使用复合文字数组初始化的指针数组

C23 中是否有 __attribute__((nonnull)) 的等效项?

C 中类型说明符的顺序重要吗?