C编程语言使用locale.h打印UTF-8字符

C programming language using locale.h to print UTF-8 characters

我想用C语言打印UTF-8字符。我试过这个但失败了:

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

int main(){
    if(setlocale(LC_ALL, "zh-CN.UTF-8")!=NULL){
        printf("Error.\n");
    }
    wchar_t *hello=L"你好";
    wprintf(L"%ls\n", hello);
}

结果:

$ gcc main.c
$ a
??

大家可以关注link看图:https://i.stack.imgur.com/PZKaa.png.

谁能帮帮我?

setlocale returns NULL on error.

如果 setlocale returns 不是 NULL,则打印一条错误消息,这意味着调用成功。未打印您的错误消息,因此看起来调用失败。这可以解释未能将 wchar_t* 转换为 UTF-8。

您可能想弄清楚 setlocale 失败的原因,尽管这可能是因为未安装该语言环境。当然,您应该更改测试以使其正确;那么您可以尝试使用 perror 来获取合理的错误消息。 (很可能 setlocale 没有将 errno 设置为对您的系统有用的任何东西。不过,还是值得一试。)

    if(setlocale(LC_ALL, "zh-CN.UTF-8") == NULL){
        perror("setlocale failed");
        exit(1);
    }

将区域设置设置为 "" 以外的任何内容通常不是一个好主意。语言环境字符串 "" 是当前在终端会话中配置的语言环境,您依赖终端正确呈现输出。如果您使用与终端不同的语言环境,则输出可能难以辨认。

感谢 rici。我跟着他,代码按要求工作了。

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

int main(){
    if(setlocale(LC_ALL, "")==NULL){  //change: from "!=" to "==", "LC_ALL, \"zh-CN.UTF-8\"" to "LC_ALL, \"\"".
        wprintf(L"Error.\n");
    }
    wchar_t hello=L'你';
    wprintf(L"%lc\n", hello);
}

此代码也按要求工作:

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

int main(){
    if(setlocale(LC_ALL, "")==NULL){
        wprintf(L"Error.\n");
    }
    wchar_t *hello=L"你好";
    wprintf(L"%ls\n", hello);
}

但是如果您的操作系统或控制台不支持 UTF-8 或您的语言,则代码将毫无用处。所以你需要在使用utf-8之前检查你的系统。如果它不支持你的语言,你应该只使用 char.