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.
我想用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.