【问题标题】:How to find the built-in function to deal with char16_t in C?如何在C中找到处理char16_t的内置函数?
【发布时间】:2013-12-16 00:42:01
【问题描述】:

请告诉字符串操作函数的char16_t 版本是什么

如:

http://www.tutorialspoint.com/ansi_c/c_function_references.htm

我找到了很多参考网站,但没有人提到。

尤其是打印功能,这是最重要的,因为它可以帮助我验证 Manipulation 功能是否有效。

#include <stdio.h>
#include <uchar.h>



char16_t *u=u"α";
int main(int argc, char *argv[])
{
    printf("%x\n",u[0]); // output 3b1, it is UTF16



    wprintf("%s\n",u); //no ouput
    _cwprintf("%s\n",u); //incorrect output

    return 0;
}

【问题讨论】:

  • 输出不正确的情况可能是因为终端没有使用正确的编码。尝试将输出转发到文件并查看其十六进制转储。
  • @CL 那么什么是“不正确的输出”?
  • @hyde,@chux,我不知道如何将 UNICODE 文本打印到文件中,我试试这个code FILE *f=fopen(L"e:\\test.txt",L"w");//and _wfopen int i=fwprintf(f,L"abc\n"); printf("%d",i); fclose(f);,i 的值为 3,test.txt 的十六进制为“ 61 62 0D 0A”,正确的 UTF16-LE 应该是“61 00 62 00 0D 00 0A 00”。对于不正确的输出,我尝试了很多组合,请这个[链接](home.netvigator.com/~fhappy/unicode_printf_result.7z),请看第一个屏幕,你可以看到“α”显示在我的windows 7控制台,它证明我的控制台能够显示 UNICODE 字符

标签: c unicode printf char16-t


【解决方案1】:

要打印/读取/打开写入等,您需要使用mbsrtowcs函数转换为32位字符。

出于所有意图和目的,char16_t 是一种多字节表示,因此,需要使用 mbr 函数来处理这种整数类型。

一些答案​​使用了完全不正确的 L“前缀”。 16 位字符串需要 u“前缀”。

以下代码为您提供使用 8、16 和 32 位字符串表示所需的一切。

#include <string.h>
#include <wchar.h>
#include <uchar.h>

如果您没有手册页 (UNIX),您可以通过 Google 搜索在 &lt;wchar.h&gt; 中找到的过程。

如果开销不是问题,Gnome.org 的 GLib 有一些很棒的代码供您使用。

char16_tchar32_t 是 ISO C11 (iso9899:2011) 扩展。

【讨论】:

    【解决方案2】:

    wprintf 及其 wchar 同事也需要在 wchar 中有 th 格式字符串: wprintf( L"%s\n", u);

    对于 wchar,L 用作字符串文字的前缀。

    编辑:

    这是一个代码 sn-p(在 Windows 上测试):

    #include <stdio.h>
    #include <io.h>
    #include <fcntl.h>
    #include <wchar.h>
    
    void main()
    {
        wchar_t* a = L"α";
        fflush(stdout); //must be done before _setmode
        _setmode(_fileno(stdout), _O_U16TEXT); // set console mode to unicode
        wprintf(L"alpha is:\n\t%s\n", a);      // works for me :)
    }
    

    控制台在 unicode 中不起作用并打印“?”对于非 ascii 字符。在 Linux 中,您需要删除 setmodefileno 之前的下划线前缀。

    注意:对于 windows GUI 打印,已经有适当的支持,所以你可以使用 wsprintf 来格式化 unicode 字符串。

    【讨论】:

    • link。请看我的测试结果,我在不同的函数中尝试了 u 前缀,L 前缀。
    • 查看更新的答案。它现在对我有用。 Alpha 是通过字符映射应用程序创建的。
    • 我的编译器(Pelles C)给了我“错误 #2048:未声明的标识符 '_O_U16TEXT'。” ,那么你能告诉我你的 fcntl.h 中的值是多少吗?因为我在我的 fcntl.h 中找不到它
    • @CLSo #define _O_U16TEXT 0x20000
    • 此答案适用于wchar_t,但不适用于标题中的char16_t
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2020-01-31
    相关资源
    最近更新 更多