首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char诉wchar_t

char诉wchar_t
EN

Stack Overflow用户
提问于 2011-09-21 07:38:24
回答 3查看 7.5K关注 0票数 7

我正在尝试打印一个wchar_t*字符串。代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <wchar.h>

char *ascii_ = "中日友好";  //line-1
wchar_t *wchar_ = L"中日友好";  //line-2

int main()
{
    printf("ascii_: %s\n", ascii_);  //line-3
    wprintf(L"wchar_: %s\n", wchar_);  //line-4
    return 0;
}

//Output
ascii_: 中日友好

问题:

  1. 显然不应该将CJK字符分配给一行1中的char*指针,但我只是这样做了,并且第3行的输出是正确的,那么为什么呢?第3行的printf()怎么能给出非ascii字符?
  2. 我假设第2行和第4行中的代码是正确的,但是为什么我没有得到第4行的输出?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-21 07:42:08

首先,在源代码中使用非ascii字符通常不是一个好主意。可能正在发生的是,汉字被编码为UTF-8,它与ascii一起工作。

现在,关于为什么wprintf()不能工作。这与流方向有关。每个流只能设置为正常流或宽流。一旦设置,它就不能改变。它是第一次使用时设置的。(这是由于printf的缘故)。在此之后,由于方向不正确,wprintf将无法工作。

换句话说,一旦使用了printf(),就需要继续使用printf()。同样,如果您从wprintf()开始,则需要继续使用wprintf()

不能将printf()wprintf()混在一起。(Windows除外)

编辑:

来回答为什么wprintf线本身也不能工作的问题。这可能是因为正在编译代码,以便将中日友好的UTF-8格式存储到wchar_中。然而,wchar_t需要4字节的unicode编码.(Windows中的2字节)

所以我可以想到两种选择:

  1. 不用费心使用wchar_t,只需使用多字节char。这是一种简单的方法,但如果用户的系统没有设置为中文语言环境,则可能会中断。
  2. 使用wchar_t,但您需要使用unicode转义序列对汉字进行编码。这显然会使它在源代码中不可读,但是它可以在任何可以打印汉字字体的机器上工作,而不管语言环境如何.

票数 9
EN

Stack Overflow用户

发布于 2011-09-21 07:44:28

第1行不是ascii,它是编译器在编译时使用的多字节编码。在现代系统上可能是UTF 8。printf不知道编码。它只是向stdout发送字节,只要编码匹配,一切都很好。

您应该注意到的一个问题是,第3行和第4行一起调用未定义的行为。不能在同一个FILE (stdout)上混合基于字符的和宽字符的io。在第一个操作之后,FILE有一个“方向”(字节或宽),然后任何执行相反方向操作的尝试都会导致UB。

票数 6
EN

Stack Overflow用户

发布于 2011-09-21 07:48:20

你漏掉了一步,所以你想错了。

磁盘上有一个C文件,包含字节。您有一个"ASCII“字符串和一个宽字符串。

ASCII字符串获取的字节与第1行中的字节完全相同,并输出它们。只要用户端的编码与程序员端的编码相同,这就可以工作。

宽字符串首先将给定的字节解码为unicode编码点,并存储在程序中--这可能是您的错误。在输出时,根据用户端的编码再次对其进行编码。这确保这些字符按预期的方式发出,而不是在输入时发出。

要么您的编译器采用错误的编码,要么您的输出终端设置的方式错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7496203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档