Tag: utf 8

使用C在终端中打印多字节字符

我一直在试验一个自定义字符串对象(struct),如下所示: typedef struct { int encoding; int length; character * array; } EncodedString; 我的想法是,通过指定编码,我可以制作一些使用该编码的函数来正确打印字符串,即ASCII或utf-8或utf-16等。(请原谅我的字符编码无知。) 现在,我正打算打印出一个(普通话)汉字:狗(0x72d7)。 我想也许是通过逐个字符打印它,它会正常工作,但显然不是。 它打印只是“r?” (分别为0x72和0xd7)。 那么如何修改这个程序以便它打印出角色? #include typedef unsigned char character; typedef struct { int encoding; int length; character * array; } EncodedString; void printString(EncodedString str); int main(void) { character doginmandarin[] = {0x72U, 0xd7U}; EncodedString mystring = {0, sizeof doginmandarin, doginmandarin}; printString(mystring); […]

是否可以在C程序中“强制”使用UTF-8?

通常当我希望我的程序使用UTF-8编码时,我会写setlocale (LC_ALL, “”); 。 但是今天我发现它只是设置定位到环境的默认语言环境,我不知道环境是否默认使用UTF-8。 我想知道有没有办法强制字符编码为UTF-8? 另外,有没有办法检查我的程序是否使用UTF-8?

使用Unicode行分隔符编译UTF-8编码的源

使用最新版本的Microsoft Compiler(包含在Win7 SDK中),我试图编译一个使用UTF-8编码的源文件和unicode行分隔符。 不幸的是,即使我在文件的开头包含UTF-8签名,代码也不会编译。 例如,如果我尝试编译它: #include int main (void) { printf(“Hello!”); return 0; } 我会看到以下错误: 提示> cl test.c Microsoft(R)32位C / C ++优化编译器版本15.00.30729.01 for 80×86版权所有(C)Microsoft Corporation。 版权所有。 test.c test.c(1):警告C4067:预处理器指令后面的意外令牌 – 预期换行符Microsoft(R)Incremental Linker Version 9.00.30729.01版权所有(C)Microsoft Corporation。 版权所有。 /out:test.exe test.obj LINK:致命错误LNK1561:必须定义入口点 以前有人遇到过这个问题吗? 有解决方案? 谢谢! 安德鲁

为什么mbstowcs返回“无效的多字节字符”

“קמ"ד חיר!” 是从gdb中的变量的打印粘贴的输入字符串副本。 调用mbstowcs返回-1,另一个输入为NULL。 关于什么是错误/如何解决这个问题的任何想法? “\327\247\327\236"\327\223 \327\227\327\231\327\250!\000\000\000″是八进制中包含非ascii字符的字符串 程序区域为C.

处理路径长度的问题

我正在创建用于Linux和Windows上的文件操作的库。 所以我需要处理路径,主要要求是我的函数将以UTF8格式接收字符串。 但它会导致一些问题,其中一个是我在Windows上使用MAX_PATH而在linux中使用PATH_MAX来表示静态路径变量。 在ASCII字符的情况下没有问题,但是当路径包含unicode字符时,如果unicode char需要每个字符2个字节,则路径长度将缩短两倍,如果unicode char需要每个字符3个字节,则路径长度将减少3倍等等。 那么这个问题有很好的解决方案吗? 提前致谢! 抱歉我的英语。

为什么在winapi中转换UTF16 – > UTF8 – > UTF16后,filename有不同的字节?

我有下一个文件: 我使用ReadDirectoryChangesW来读取当前文件夹中的更改。 我得到了这个文件的路径:L“TESTӠ⬨☐.ipt”: 接下来,我想将其转换为utf8并返回: std::string wstringToUtf8(const std::wstring& source) { const int size = WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0, NULL, NULL); std::vector buffer8(size); WideCharToMultiByte(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer8.data(), size, NULL, NULL); } std::wstring utf8ToWstring(const std::string& source) { const int size = MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), NULL, 0); std::vector buffer16(size); MultiByteToWideChar(CP_UTF8, 0, source.data(), static_cast(source.size()), buffer16.data(), size); […]

将UTF-8文本转换为wchar_t

我知道这个问题在这里已经被问了很多次了,我确实读了一些答案,但是有一些建议的解决方案,我试图找出最好的解决方案。 我正在编写一个基本上接收以UTF-8编码的XML文本的C99应用程序。 它的一部分工作是复制和操作该字符串(找到一个substr,cat it,ex ..) 因为我现在不想使用外部非标准库,我试图使用wchar_t来实现它。 目前,即时通讯使用mbstowcs将其转换为wchar_t以便于操作,对于某些输入我尝试了不同的语言 – 它工作正常。 事实上,我确实读过一些人,因为UTF-8和mbstowcs存在一些问题,所以我想知道这种使用是否被允许/接受。 我遇到的其他选项是使用带有WCHAR_T参数的iconv。 事实上,即时工作在一个平台(而不是PC)上,它的语言环境对ANSI C语言环境非常有限。 那个怎么样? 我也遇到过一些非常受欢迎的C ++库。 但我限制C99实施。 另外,我将在另一个平台上编译此代码,wchar_t的sizeof不同(2个字节对​​比我机器上的4个字节)。 我怎么能克服这个? 使用固定大小的char容器? 但是,我应该使用哪些操作function呢? 很高兴听到一些想法。 谢谢。

将多字节字符映射到其unicode点表示

如何将单个UTF-8字符映射到C中的unicode点? [例如, È将映射到00c8 ]。

为什么`strchr`似乎与多字节字符一起工作,尽管手册免责声明?

从: man strchr char * strchr(const char * s,int c); strchr()函数返回指向字符串s中第一次出现的字符c的指针。 这里“字符”表示“字节”; 这些函数不适用于宽字符或多字节字符。 不过,如果我尝试搜索像é (UTF-8中的0xC3A9 )这样的多字节字符: const char str[] = “This string contains é which is a multi-byte character”; char * pos = strchr(str, (int)’é’); printf(“%s\n”, pos); printf(“0x%X 0x%X\n”, pos[-1], pos[0]); 我得到以下输出: 这是一个多字节字符 0xFFFFFFC3 0xFFFFFFA9 尽管有警告: 警告:多字符字符常量[-Wmultichar] 所以这是我的问题: 什么意味着strchr不适用于多字节字符? (它似乎工作,只要int类型足够大,包含你的多字节,最多4个字节) 如何摆脱警告,即如何安全地恢复多字节值并将其存储在int中? 为什么前缀为0xFFFFFF ?

C中的UTF8处理

我对UTF8有基本的了解:代码点具有可变长度,因此“字符”可以是8位,16位甚至更长。 我想知道的是,如果C语言中有一些示例代码,库等与UTF8字符串类似,就像CEg中的标准库那样告诉字符串的长度等等。 谢谢,