【问题标题】:How to print 2-byte unicode characters如何打印 2 字节的 unicode 字符
【发布时间】:2019-07-02 07:49:56
【问题描述】:

我正在尝试打印这个还包含 unicode 字符的向量:

unsigned short RussianStr[] = { 0x044D, 0x044E, 0x044F, 0x0000};

出于这个原因,我不能使用 char 向量,但不能使用 unsigned short 向量。如何打印所有矢量字符?使用 printf () 函数,我只看到打印的第一个字符

【问题讨论】:

  • cmets 内部可能的答案:stackoverflow.com/questions/39576310/…
  • 您仍应使用 unsigned char,因为您的代码取决于系统的字节序。 IE。结果字节可能是{ 0x04, 0x4D, 0x04, 0x4E, ...{ 0x4D, 0x04, 0x4E, 0x04, ...
  • @Chris 我也想过将 16 位分成 2 个不同的字节,但是我怎样才能打印正确的字符呢?
  • 我在这里考虑的是 UTF-8,但我看到你没有提到你的环境是否支持它。我认为一个有效的答案需要更多关于你需要支持哪种环境的信息。

标签: c


【解决方案1】:

有专门的函数和类型来处理宽字符

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

int main(void) 
{
    wchar_t RussianStr[] = {0x044D, 0x044E, 0x044F, 0x0000};

    setlocale(LC_ALL, "");
    wprintf(L"%ls\n", RussianStr);
    return 0;
}

【讨论】:

  • 在我的机器上(使用LANG=en_US.UTF-8),输出是:эюя — 看起来像是俄语。
  • 我通过 MPLAB X IDE 在微控制器环境(更具体地说是 Microchip)中使用 C。我不确定 wchar.h 库是否存在
  • 在这种情况下,@AntoninoINDEVA,你被卡住了。您要么必须找到支持,要么必须编写自己的支持,可能包括 Cyrillic 的字体文件(或完整的 Unicode 字体)以及相关的显示代码等。这将是一项中等规模的重大工作——你可能会赢一夜之间完成。 OTOH,如果您的嵌入式环境已经支持 UTF-8(和 Cyrillic),如果您找不到任何对该操作的内置支持,您可以相当简单地编写代码以从 UTF-16 转换为 UTF-8。
  • @chux,是的,但是看看this explanation:您可以使用printf 来输出宽字符串,但wprintf 更合适,因为它本机处理宽字符。例如,长度修饰符的单位是带有wprintf 的“宽字符”——而不是带有printf 的字节。
【解决方案2】:

问题不在于如何打印 utf-16 值……而是你的终端是否会打印 utf。

如果您的终端支持 utf,那么您只需使用 wchar_t 替代 printf 系列函数...而不是使用 char,而是使用 wchar_t 字符。由于终端通常是面向字节的,因此语言环境函数将进行从 utf-16 到 utf-8 的转换,并输出 utf-8 字符。

wprintf(3) 和许多其他人。

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多