char 与 wchar_t

2023-11-23

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

#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 行的任何输出?


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

现在,至于为什么wprintf()不工作。这与流方向有关。每个流只能设置为正常或宽。一旦设定,就无法更改。第一次使用时已设置。 (这是ascii,因为printf)。之后wprintf由于方向不正确而无法工作。

换句话说,一旦你使用printf()你需要继续使用printf()。同样,如果你从wprintf(),你需要继续使用wprintf().

你不能混合printf() and wprintf()。 (Windows 上除外)

EDIT:

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

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

  1. 别打扰wchar_t,并坚持使用多字节chars。这是最简单的方法,但如果用户的系统未设置为中文语言环境,则可能会失败。
  2. Use wchar_t,但是您需要使用 unicode 转义序列对中文字符进行编码。这显然会使其在源代码中不可读,但它可以在任何可以打印汉字字体的机器上运行,无论语言环境如何。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

char 与 wchar_t 的相关文章

随机推荐

  • 为什么 typescript-eslint 对 enumMember 强制采用驼峰命名法?

    TypeScript 文档中的所有枚举示例写入枚举成员作为帕斯卡命名法 例如 enum Direction Up 1 Down Left Right But typescript eslint 命名约定强制使用驼峰命名法 并拒绝帕斯卡命名法
  • 我可以使用谷歌地图 API v3 来获取位置的时区吗?

    是否可以使用谷歌地图API来获取时区 我已经在使用它的 api 进行地理编码和地图显示 我还想添加时区 但我在文档中找不到任何内容 有任何想法吗 链接 您可以使用时区API 例如 使用 jQuery ajax url https maps
  • NodeJS:如何将base64编码的字符串解码回二进制? [复制]

    这个问题在这里已经有答案了 我正在使用 salt 实现密码哈希 因此我将 salt 生成为二进制 对密码进行哈希处理 对密码和 salt 进行 Base64 编码 然后将它们存储到数据库中 现在 当我检查密码时 我应该将盐解码回二进制数据
  • Android 从布局视图创建并打印 pdf

    我正在尝试从 xml 布局视图创建 PDF 文件 我在该布局中有一个列表视图 添加项目并根据子项设置高度 PDF 正在创建但未填充整个页面 我尝试过的是 PdfDocument PageInfo pageInfo new PdfDocume
  • Android中如何获取唯一的设备硬件ID? [复制]

    这个问题在这里已经有答案了 如何获取 Android 中唯一的设备 ID 该 ID 在执行手机重置或操作系统更新时无法更改 更新 19 11 2019 下面的答案与今天不再相关 因此 对于任何寻找答案的人 您应该查看下面链接的文档 http
  • 使用 java 中的 toUpperCase() 将 ß.cfg 转换为大写

    我正在尝试以下代码 String s1 cfg System out println s toUpperCase 我得到的输出是SS CFG因为 Unicode 没有定义 的大写版本 而我希望输出为 CFG 我有什么办法可以实现这一目标吗
  • 从基于 Flask 的 Python 服务器下载文件

    我正在尝试使用我在以下 URL 找到的代码 http code runnable com UiIdhKohv5JQAAB6 how to download a file generated on the fly in flask for p
  • 如何使用 SWRevealViewController 显示调整大小的侧边栏?

    我在 IOS 应用程序 通用 中使用 SWRevealViewController 我在 iPhone 和 iPad 中都获得了侧边栏 但我想显示覆盖 90 屏幕的侧边栏 我该怎么办 打开SWRevealViewController m文件
  • 通过 pandas 中列名称的子字符串融化列(python)

    我有数据框 subject A target word gd A target word fd B target word gd B target word fd subject type 1 1 2 3 4 mild 2 11 12 13
  • Swing:如何制作具有软边框的非矩形窗口?

    如何在 Java 中制作具有软边框的非矩形窗口 软边框 也称为软剪裁 是没有锯齿伪影的边框 我在网上搜索了很多 发现了几篇关于半透明和 或 非矩形窗户 软边界 这个话题很令人困惑 看来我找到的信息有优惠 将软边框应用于组件inside另一个
  • 有时 Facebook 共享对话框无法在 iOS 上加载

    有时 当我启动 Facebook 共享对话框时 操作系统会切换到 Facebook 应用程序 但共享对话框不会加载 然后如果你再试一次 通常会成功 为什么第一次不起作用 NSURL url NSURL URLWithString some
  • 如何在 Perl 中有效地解析 CSV 文件?

    我正在开展一个项目 涉及在 Perl 中解析大型 csv 格式的文件 并且希望提高工作效率 我的方法是split 首先按行读取文件 然后split 每行再次用逗号来获取字段 但这并不是最理想的 因为至少需要两次传递数据 一次按行分割 然后再
  • 相同数据的多个查找结构:内存重复?

    假设我有一群人的数据 并且我希望能够以不同的方式查找他们 也许有某种数据结构 如二叉树 可以方便按名称查找 也许还有另一个 如列表 是按创建顺序排列的 也许还有更多 在许多语言中 每个人都会在堆上分配一次 每个数据结构都包含指向该内存的指针
  • Rails 应用程序有批量电子邮件插件吗?

    有谁知道有一个插件或可以用来为 Rails 应用程序发送批量电子邮件的东西吗 具体来说 我希望能够将 HTML 电子邮件文件传递给 rake 任务或其他任务 并将其通过电子邮件发送给所有注册到我的网站并选中 请向我发送有关 XXX 的信息
  • 确定是否通过 FCM 通知单击打开了活动

    我正在使用 fcm 控制台向所有安装了我的应用程序的设备发送消息 通知没有任何额外的有效负载 只有通知消息 我想知道是否有一种简单的方法可以知道是否通过 FCM 通知单击打开了活动 有一个解决方案 通过扩展FirebaseMessaging
  • 模拟索引属性

    我正在使用 Moq 编写单元测试 我创建了一个模拟对象 现在 当我尝试模拟其属性时 我收到错误 表达式树可能不包含索引属性 这是我的代码 public Node GetNode IMyInterface interface string i
  • Pycharm:设置运行manage.py任务的环境变量

    我已经移动了我的SECRET KEY我的设置文件中的值 当我加载 virtualenv 时它会被设置 我可以确认该值存在于python manage py shell 当我运行 Django 控制台时 SECRET KEY失踪了 这是应该的
  • 如何在 Perl 中增加带有前导零的值?

    这是同样的问题this one 但是使用 Perl 我想迭代一个只有一个前导零的值 shell 中的等价物是 for i in seq w 01 99 do echo i done 由于前导零很重要 因此您可能希望将它们用作字符串 而不是数
  • 获取添加的 DOM 节点的 className (mutationObserver)

    我正在编写一个简单的用户脚本 如果 Facebook 帖子包含特定的单词列表 它将自动隐藏该帖子 核心功能有效 但我的MutationObserver似乎没有读过className of mutation addedNodes适当地 我循环
  • char 与 wchar_t

    我正在尝试打印出 wchar t 字符串 代码如下 include