Articles of wchar t

wchar_t在Linux上的UTF-16?

在Linux上使用wchar_t*来存储UTF-16编码文本是否有意义? 显而易见的问题是,Linux上的wchar_t是四个字节,UTF-16每个字符通常需要两个(或者两个两个一组两个)字节。 我正在尝试使用第三方库,确实如此,这似乎很混乱。 看起来事情是搞砸了,因为在Windows上wchar_t是两个字节,但我只是想仔细检查,因为这是一个非常昂贵的商业图书馆,可能是我只是不明白的东西。

C / C ++中的跨平台unicode:使用哪种编码?

我目前正在开发一个应该在Windows和Linux上工作的业余爱好项目(C / C ++),全面支持Unicode。 可悲的是,Windows和Linux使用不同的编码,使我们的生活更加困难。 在我的代码中,我试图尽可能地使用数据,使Windows和Linux都变得简单。 在Windows中,默认情况下,wchar_t被编码为UTF-16,在Linux中被编码为UCS-4(如果我错了,请纠正我的错误)。 我的软件打开({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux})并将数据写入UTF-8文件。 到目前为止,这都是可行的。 直到我决定使用SQLite。 SQLite的C / C ++接口允许一个或两个字节的编码string( 单击 )。 当然这在Linux中不适用于wchar_t,因为Linux中的wchar_t默认是4字节。 因此,从sqlite的写入和读取需要转换为Linux。 目前,代码在Windows / Linux的例外情况下正在混乱。 我希望坚持在wchar_t中存储数据的标准思想: Windows中的wchar_t:文件path没有问题,读写sqlite没有问题。 无论如何,将数据写入文件应该使用UTF-8。 Linux中的wchar_t:由于UTF-8编码导致的文件pathexception,读/写到sqlite(wchar_t)之前的转换,以及将数据写入文件时的相同。 读完( 在这里 )我确信我应该坚持在Windows中的wchar_t。 但是在完成所有工作之后,麻烦就从移植到Linux开始了。 目前我正在考虑重做这一切,以坚持简单的字符(UTF-8),因为它适用于Windows和Linux,记住,我需要'WideCharToMultiByte'在Windows中的每个string来实现UTF-8。 使用简单的基于char *的string将大大减lessLinux / Windows的例外数量。 你有任何跨平台unicode的经验吗? 任何关于简单地将数据存储在UTF-8而不是使用wchar_t的想法?

打印wchar到Linux控制台?

我的C程序粘贴在下面。 在bash中,程序打印“char is”,Ω不打印。 我的语言环境都是en_US.utf8。 #include <stdio.h> #include <wchar.h> #include <stdlib.h> int main() { int r; wchar_t myChar1 = L'Ω'; r = wprintf(L"char is %c\n", myChar1); }

C中的宽字符input/输出总是从正确的(系统默认)编码读取/写入?

我主要感兴趣的是类似Unix的系统(例如,便携式POSIX),因为看起来Windows对于宽字符是很奇怪的。 读取和写入宽字符函数(如getwchar()和putwchar() )总是“做正确的事情”,例如从utf-8中读取,并在设置的locale中写入utf-8。手动调用wcrtomb()并使用例如fputs()打印string? 在我的系统(openSUSE 12.3)中, $LANG设置为en_GB.UTF-8他们似乎做了正确的事情(检查输出,我看到了什么看起来像UTF-8,即使string使用wchar_t存储和使用宽字符function)。 但是我不确定这是否有保证。 例如cprogramming.com指出: [宽字符]不应该用于输出,因为虚假零字节和其他含义相同的低ASCII字符(如'/'和'\ n')可能会散布在整个数据中。 这似乎表明,输出宽字符(推测使用宽字符输出function)可能会造成严重破坏。 由于C标准似乎没有提到编码,所以我真的不知道在使用wchar_t时应用何种编码方式。 所以我的问题是,如果我的应用程序不需要知道所使用的编码,那么读,写和使用宽字符是一个适当的事情。 我只需要string长度和控制台宽度( wcswidth() ),所以在处理文本时处处使用wchar_t似乎是理想的。

在windowsterminal输出unicode字符

在过去的一周里,我和一位朋友一起在C ++上开发了一个roguelike游戏。 大多也学习语言。 我在用着: pdcurses Windows 7的 Visual Studio C ++ 在控制台中输出wchar_t的任何地方。 我已经成功地输出了一些Unicode字符,例如\ u263B(☻),但是其他的如\ u2638(☸)最终会成为问号(?)。 以下是我用于输出的相关代码。 // Container of room information struct RoomInfo { wchar_t * layout; int width; int height; }; // The following function builds RoomInfo RoomInfo Room::examine(IActor * examinor) { RoomInfo ri; ri.width = this->width; ri.height = this->height; ri.layout = new wchar_t[height […]

在C ++中的可移植wchar_t

在C ++中是否有可移植的wchar_t? 在Windows上,它的2个字节。 一切都是4个字节。 我想在我的应用程序中使用wstring,但是如果我决定将它移植到端口上,会造成问题。

如何在Linux中使用POSIX方法从文件中读取Unicode-16string?

我有一个包含UNICODE-16string的文件,我想读入Linux程序。 这些string是从Windows的内部WCHAR格式生成的。 (Windows是否总是使用UTF-16?例如日文版本) 我相信我可以使用原始读取和使用wcstombs_l进行转换来读取它们。 但是,我无法确定要使用的区域设置。 在我的最新的Ubuntu和Mac OS X机器上运行“locale -a”会得到零名称的UTF-16语言环境。 有没有更好的办法? 更新:正确的答案和其他下面的帮助指向我使用libiconv。 这是我用来完成转换的function。 我现在有一个类,它使转换成一行代码。 // Function for converting wchar_t* to char*. (Really: UTF-16LE –> UTF-8) // It will allocate the space needed for dest. The caller is // responsible for freeing the memory. static int iwcstombs_alloc(char **dest, const wchar_t *src) { iconv_t cd; const char from[] […]