Tag: wchar t

如何避免C中的整数提升?

目前尚不清楚如何使用宽字符API在C中编写可移植代码。 考虑这个例子: #include #include #include int main(void) { setlocale(LC_CTYPE, “C.UTF-8”); wchar_t wc = L’ÿ’; if (iswlower(wc)) return 0; return 1; } 使用-Wconversion选项使用gcc-6.3.0进行编译会发出以下警告: test.c: In function ‘main’: test.c:9:16: warning: conversion to ‘wint_t {aka unsigned int}’ from ‘wchar_t {aka int}’ may change the sign of the result [-Wsign-conversion] if (iswlower(wc)) return 0; ^ 为了摆脱这个警告,我们转换为(wint_t) ,就像iswlower((wint_t)wc) ,但这是iswlower((wint_t)wc)移植的。 以下示例说明了为什么它不可移植。 […]

如何将多字节字符串转换为glibc中fxprintf.c中的宽字符串?

目前, glibc perror源程序中的逻辑是这样的: 如果stderr是面向的,那么按原样使用它,否则使用dup()它并在dup() ‘ed fd上使用perror() 。 如果stderr是面向广域的,则使用stdio-common / fxprintf.c中的以下逻辑: size_t len = strlen (fmt) + 1; wchar_t wfmt[len]; for (size_t i = 0; i < len; ++i) { assert (isascii (fmt[i])); wfmt[i] = fmt[i]; } res = __vfwprintf (fp, wfmt, ap); 通过以下代码将格式字符串转换为宽字符forms,我不明白: wfmt[i] = fmt[i]; 此外,它使用isascii断言: assert (isascii(fmt[i])); 但格式字符串在宽字符程序中并不总是ascii,因为我们可能使用UTF-8格式字符串,它可以包含非7位值。 为什么在运行以下代码时没有断言警告(假设UTF-8语言环境和UTF-8编译器编码)? #include #include #include #include […]

用于unicode的C CSV API

我需要一个C API来处理可以使用unicode的CSV数据。 我知道libcs​​v(sourceforge.net/projects/libcs​​v),但我认为这不适用于unicode(请纠正我,如果我错了)因为没有看到使用wchar_t。 请指教。

可以将wchar_t提升为wint_t吗?

我看到glibc参考和修订1到C90的一个矛盾。 来自glibc引用的引用说wchar_t可能会被提升为wint_t: 如果将wchar_t定义为char,则由于参数提升,必须将类型wint_t定义为int 但AMD1说: 目前,现有的实现可能有wchar_t为int,wint_t为long,默认促销不会将int更改为long。 基本上,这是由于wchar_t和wint_t是typedef。 因此,我们现在不会将wchar_t提升为wint_t。 有人知道哪一个是正确的吗? 标准是否保证在以下两个程序中转换为unsigned int和int是正确的? (我只是将wint_t和wchar_t替换为它们在glibc中的实际含义)(我只是将wint_t和wchar_t替换为它们在glibc中的实际含义) #include #include int main(void) { setlocale(LC_CTYPE, “en_US.UTF-8”); unsigned int wc; wc = getwchar(); putwchar((int) wc); } – #include #include #include int main(void) { setlocale(LC_CTYPE, “en_US.UTF-8”); int wc; wc = L’ÿ’; if (iswlower((unsigned int) wc)) return 0; return 1; }

将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呢? 很高兴听到一些想法。 谢谢。

为什么没有“unsigned wchar_t”和“signed wchar_t”类型?

char的签名不是标准化的。 因此,有signed char和unsigned char类型。 因此,使用单个字符的函数必须使用可以包含signed char和unsigned char的参数类型(此类型被选为int ),因为如果参数类型为char ,我们将从编译器获取类型转换警告(如果在这样的代码中使用-Wconversion): char c = ‘ÿ’; if (islower((unsigned char) c)) … warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result ( 这里我们考虑如果islower()的参数类型为char会发生什么 ) 而没有明确类型转换使其工作的事情是从char到int自动升级。 此外,引入了wchar_t的ISO C90标准没有说明wchar_t的表示。 来自glibc引用的一些引用: 将wchar_t定义为char是合理的 如果将wchar_t定义为char则由于参数提升,必须将类型wint_t定义为int 。 因此, wchar_t可以很好地定义为char ,这意味着必须应用类似于宽字符类型的规则,即,可能存在wchar_t为正的实现,并且可能存在wchar_t为负的实现。 unsigned wchar_t ,必须存在unsigned wchar_t和signed wchar_t类型(出于与unsigned char和signed char类型相同的原因)。 私有通信显示允许实现仅支持> = 0值的宽字符(与wchar_t的签名无关)。 […]

为什么`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 ?

glib gunichar和wchar_t之间有什么区别,哪个更适合跨平台解决方案?

我正在尝试编写一些只在用户拥有gcc可移植的C代码,并安装了glib 。 从我的所有研究中,我发现使用gcc , wchar_t总是被定义为4个字节,而使用glib , gunichar也是4个字节。 我没想到的是,如果像gunichar , wchar_t也被编码为UCS4。 是这样的吗? 如果是这样,我应该能够简单地将gunichar*转换为wchar_t*并使用stdc wcs*函数,对吧?

swprintf在8位范围之外的字符上扼流圈

这发生在OS X上,但我怀疑它适用于任何UNIX-y操作系统。 我有两个字符串,如下所示: const wchar_t * test1 =(const wchar_t *)“\ x44 \ x00 \ x00 \ x00 \ x73 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00”; const wchar_t * test2 =(const wchar_t *)“\ x44 \ x00 \ x00 \ x00 \ x19 \ x20 \ x00 \ x00 […]

fputwc(),putwc()和putwchar()在glibc中的定义不一致

为什么fputwc() , putwc()和putwchar()接受wchar_t类型的参数而不是wint_t ? 这与相应的非宽字符函数fputc() , putc()和putchar()相矛盾, 它们采用int而不是char 。