简而言之,我尝试从{0xe2, 0x98, 0xba}
获取这些int c = L'☺';
而没有unistd
以外的任何库。
我知道这与位面具有什么关系,但是在几个小时的无处之后我需要一只手。
谢谢!
答案 0 :(得分:1)
使用某些UTF-8 / Unicode库,例如libunistring;许多库具有UTF8相关功能,例如Glib。 C11具有一些 multibyte character支持(因此请检查您的实现是否使用UTF8 ...)
详细了解Unicode和UTF-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]