Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么printf没有';不要打印我喂它的东西?_C_Encoding - Fatal编程技术网

C 为什么printf没有';不要打印我喂它的东西?

C 为什么printf没有';不要打印我喂它的东西?,c,encoding,C,Encoding,它输出: printf("%s\n", "ああ"); 要正确打印它,我还应该做些什么?我认为您可能必须使用wprintf,这是printf的宽字符版本,假设是unicode,请使用C99编译器编译 ã‚ã‚ #包括 #包括 #包括 内部主(空){ wchar_t buff[3];//=L”ああ"; buff[0]=buff[1]=L'\U00003042'; buff[2]=0; setlocale(LC_ALL,“”); wprintf(L“%ls\n”,浅黄色); 返回0; } 绝对正确

它输出:

printf("%s\n", "ああ");

要正确打印它,我还应该做些什么?

我认为您可能必须使用
wprintf
,这是
printf
的宽字符版本,假设是unicode,请使用C99编译器编译

ã‚ã‚
#包括
#包括
#包括
内部主(空){
wchar_t buff[3];//=L”ああ";
buff[0]=buff[1]=L'\U00003042';
buff[2]=0;
setlocale(LC_ALL,“”);
wprintf(L“%ls\n”,浅黄色);
返回0;
}

绝对正确的版本应如下所示:

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

int main(void) {
  wchar_t buff[3]; // = L"ああ";
  buff[0] = buff[1] = L'\U00003042';
  buff[2] = 0;
  setlocale(LC_ALL, "");
  wprintf(L"%ls\n", buff);
  return 0;
}
#包括
#包括
#包括
int main()
{
wchar_t*s1=L“♠♣♥♦";
wcharšt*s2=L“Příšerněěěluťoučkýkůň”;
wchar_t*s3=L“ああ";
setlocale(LC_ALL,“”;/*拉取系统区域设置以获得正确的输出*/
wprintf(L“%ls\n%ls\n%ls\n”,s1、s2、s3);/*打印所有三个字符串*/
返回0;
}
编辑:


正如R.在评论中指出的,您实际上可以使用
printf
而不是
wprintf
。唯一的限制是
printf
的格式化字符串必须是
const char*
,而不是
const wchar\u t*
wprintf
。因此格式化字符串中没有宽字符。

重要的是,C89不支持字符串文本的多字节编码(仅ASCII),标准C函数可以处理其他编码的输入/输出,前提是可以将其视为不透明的blob

例如,这一条是正确的:

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

int main()
{
        wchar_t *s1 = L"♠♣♥♦";
        wchar_t *s2 = L"Příšerně žluťoučký kůň";
        wchar_t *s3 = L"ああ";

        setlocale(LC_ALL,""); /* pull system locale for correct output */
        wprintf(L"%ls\n%ls\n%ls\n",s1,s2,s3); /* print all three strings */
        return 0;
}

如果您的区域设置不是UTF-8,或者您的编辑器使用UTF-8以外的编码保存文件,我怀疑结果会有所不同。

您有什么平台、区域设置和编码?您的源文件使用什么编码?编译器接受这种编码吗?您的运行时环境支持什么编码?您的终端支持什么编码应为?@dalle,在打印多字节字符时代码是否需要更改?@dalle这与此无关,因为从内部编码到外部编码的转换是由C标准库完成的。@new_perl:解释输出:字符串”ああ“UTF-8中编码的是字节序列{0xE3 0x81 0x82 0xE3 0x81 0x82}。Windows-1252编码中的这个字节序列是Unicode字符序列{U+00E3 U+201A U+00E3 U+201A}”,因为0x81在Windows-1252编码中无效,不能输出到控制台。U+00E3是“带波浪号的拉丁小写字母A”,U+201A是“单低9引号”。所以c接受的唯一多字节编码是unicode?它可以是utf8或其他编码吗?@new_perl如果您谈论的是字符串文字(或整个代码本身),然后是。UTF-8是存储文本文件的首选方法。但是,如果编译器能够正确处理数据,您实际上可以使用不同的编码。@pmg您缺少区域设置。只有当内部编码与系统编码匹配时,此方法才有效(因此在Windows上可以使用)@new_perl:Unicode不是多字节编码。C不强制使用Unicode字符集或任何特定的多字节编码,这取决于您的实现您可以使用什么编码。就我个人而言,我更喜欢将我的源代码保存在US-ASCII中,并将所有本地化的资源字符串保存在源代码外部。@new_perl好吧,编辑的作者或者不知道Unicode的意思:-我得到了这个:
错误:转换为执行字符集:无效或不完整的多字节或宽字符
@new\u perl请确保您使用正确的编码存储文件。UTF-8应该适用于大多数编译器。这不是“绝对正确的”“这是正确的,因为它不是通用的便携设备。此网页使用UTF-8。如果从这段代码中获取字节,编译器必须使用UTF-8来解释源代码,目标系统也必须使用UTF-8。有很多C环境不使用或不支持UTF-8,但使用其他编码。@恕我直言,支持C99并不意味着它知道如何处理UTF-8编码。但是,它仍然必须支持处理非ASCII字符的某种编码。这里绝对没有理由使用
wprintf
,事实上,如果任何非宽stdio函数与
stdout
一起使用,它将严重破坏您的程序!!只需将
printf
%ls
格式说明符一起使用即可。在大多数情况下,宽stdio函数应该被认为是有害的,永远不要使用。
#include <stdio.h>
int main() {
    printf("%s\n", "\xe3\x81\x82\xe3\x81\x82");
}
#include <stdio.h>
#include <string.h>
int main() {
    printf("%lu\n", strlen("\xe3\x81\x82\xe3\x81\x82"));
}
hexdump -Cv b.c
00000000  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 69 6f 2e  |#include <stdio.|
00000010  68 3e 0a 69 6e 74 0a 6d  61 69 6e 28 29 0a 7b 0a  |h>.int.main().{.|
00000020  20 20 20 20 70 72 69 6e  74 66 28 22 25 73 5c 6e  |    printf("%s\n|
00000030  22 2c 20 22 e3 81 82 e3  81 82 22 29 3b 0a 7d 0a  |", "......");.}.|
00000040
./a.out | hexdump -Cv
00000000  e3 81 82 e3 81 82 0a                              |.......|
00000007