从int读取字节以写入Unicode C.

时间:2017-09-20 04:59:51

标签: c unicode bit-manipulation

简而言之,我尝试从{0xe2, 0x98, 0xba}获取这些int c = L'☺';而没有unistd以外的任何库。

我知道这与位面具有什么关系,但是在几个小时的无处之后我需要一只手。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用某些UTF-8 / Unicode库,例如libunistring;许多库具有UTF8相关功能,例如Glib。 C11具有一些 multibyte character支持(因此请检查您的实现是否使用UTF8 ...)

详细了解UnicodeUTF-8,包括 http://utf8everywhere.org/

也许您的操作系统或C实现提供了一些东西。

UTF-8& Unicode是复杂的(具有微妙的角落情况);因此,请避免重新发明轮子,并试图自己做一些功能。

可能L'☺'表示在Windows和Linux上有所不同(例如因为sizeof(wchar_t)可能不同;它可能是16位或32位)。你的C源文件可以是UTF8编码的(这通常是 的情况),但可能不是,所以源代码中的L'☺'究竟是有争议的。

(理论上源代码可能不是UTF8)

为了安全起见,最好坚持使用UTF-8,假设并记录C源文件和实现都使用UTF-8,所以使用UTF-8 everywhere,没有任何wchar_t或{{1} },并且有一个L'☺'字符串(而不是"\342\230\272"),或许在评论中提到它是"☺";或至少使用字符串/*U+263A WHITE SMILING FACE ☺*/,但避免使用宽字符。

换句话说,我听说包含"☺"的源代码在Windows和Linux之间不可移植(但我不关心,因为我从未使用过Windows)。因此,出于可移植性的原因,至少使用像L'☺'这样的文字字符串(但"☺"更好),并明确记录在源代码和应用程​​序的输入中使用的编码(最好是UTF-8)和输出

Character encoding可能成为一场噩梦。你会发现像libiconv这样的库来处理它。但是在2017年使用UTF-8 everywhere(在您的C源代码和程序输出中都有),因此在源代码中避免使用"\342\230\272"

答案 1 :(得分:1)

如果你有一个C11编译器,它有一个带unicode支持的标准头。你想要例程c32rtomb:

#include <uchar.h>

char buffer[4];
len = c32rtomb(buffer, L'☺', 0);

答案 2 :(得分:1)

  

从int读取字节以写入Unicode C
  我试图从int c = L'☺';获取{0xe2,0x98,0xba}

如果代码可以从 UTF-8字符串文字开始,建议:

#include <stdio.h>

int main(void) {
  char *s = u8"☺";
  printf("0x%02hhx 0x%02hhx 0x%02hhx\n", s[0], s[1], s[2]);
  return 0;
}

输出

0xe2 0x98 0xba

要生成整数,请使用足够宽的整数类型,例如uint32_t和值s[0], s[1], s[2]