C 使用fopen/write时的汉字问题

C 使用fopen/write时的汉字问题,c,unicode,encoding,file-io,C,Unicode,Encoding,File Io,我必须在Linux中将配置信息写入文件,而配置信息包含中文字符 我只使用字符数组,而不是使用wchar\u t,对吗 这是我的密码: 是否有一种优雅的方式,仅使用ASCII字符来表示ASCII中没有的字符?没有 但也有可能以不雅的方式这样做 char str[MSG_LEN] = "\xE9\x85\x8D\xE7\xBD\xAE\xE6\x96\x87\xE4\xBB\xB6\xE4\xB8\xAD\xE5\x8C\x85\xE5\x90\xAB\xE4\xB8\xAD\xE6\x96\x8

我必须在Linux中将配置信息写入文件,而配置信息包含中文字符

我只使用字符数组,而不是使用
wchar\u t
,对吗

这是我的密码:


是否有一种优雅的方式,仅使用ASCII字符来表示ASCII中没有的字符?没有

但也有可能以不雅的方式这样做

char str[MSG_LEN] = "\xE9\x85\x8D\xE7\xBD\xAE\xE6\x96\x87\xE4\xBB\xB6\xE4\xB8\xAD\xE5\x8C\x85\xE5\x90\xAB\xE4\xB8\xAD\xE6\x96\x87";
当然,与原始程序一样,这假设查看文件名的人(例如使用
ls
)的区域设置基于UTF-8

我没有使用wchar\u t,而是使用char数组,对吗

我想说不。
char
的默认字符集和编码是实现定义的(可以是EBCDIC或ASCII或UTF-8,或者源文件碰巧使用的任何东西或任何其他东西),而
wchar\u t
的默认字符集和编码也是实现定义的(可以是UTF-16LE或…)

如果需要输出为UTF-8;然后(特别是对于可移植代码),您需要忽略C编译器感觉到的随机默认无意义。您还应该避免使用
char
,因为它是有符号的还是无符号的是由实现定义的;避免使用
unsigned char
,因为不能保证它是8位的;避免使用
wchar\u t
(因为它的大小是由实现定义的)

具体来说(对于UTF-8),我会使用
uint8\u t
,比如:

uint8_t str[] = 0xE9, 0x85, 0x8D, 0xE7, 0xBD, 0xAE, 0xE6, 0x96, 0x87, 0xE4, 0xBB, 0xB6,
                0xE4, 0xB8, 0xAD, 0xE5, 0x8C, 0x85, 0xE5, 0x90, 0xAB, 0xE4, 0xB8, 0xAD,
                0xE6, 0x96, 0x87, 0x00;

当然,如果您希望文件包含CNS-11643(或任何其他内容),您也可以这样做。您只需要找到一个合适的类型,并找到“该类型的数字数组”(例如,可能通过在使用所需字符集和编码的文本文件上使用类似于
hextump
的实用程序)。

要可靠而优雅地获得UTF-8字符串,无论编码如何,您都可以添加

char str[]
可以更改为


这样,您就不需要找到编码的UTF-8字节,当您需要UTF-16或UTF-32等其他编码时,只需更改类型和前缀(
u8
u
u
)。编译器将自动转换编码以保证内存中的字节序列正确

Re“如果源代码编码为ISO8859-1”…则它不可能包含
char str[MSG_LEN]=”配置文件中包含中文";,因为在ISO8859-1字符集中找不到汉字。“有没有优雅的方法来处理汉字”确保文件是UTF-8。“我无法确保源文件编码。“是的,你可以。@MaxVollmer我的同事总是更改源代码编码,这让我很疯狂。那就和你的同事谈谈,想办法确保这种情况不再发生。在项目中就一致的文件编码达成一致不是火箭科学。请确保团队中的每个人都将他们使用的软件的编码设置为您作为团队商定的编码。我无法在运行时转换中文字符。上面的示例仅显示了我处理中文字符的方式。@J.Doe,我不知道您在说什么。我没有说过在运行时进行任何转换。上述内容100%等同于您发布的程序。str不是我在上述示例中编写的内容,我必须在代码中处理用户输入的汉字。@J.Doe文件的编码对用户输入没有影响。文件的编码唯一重要的时候是在文本中包含中文字符串时。当你这样做时,你可以使用我的解决方案。我稍后会尝试,我必须从数据库或用户输入中读取一些内容,这些内容将包含汉字并将它们连接在一起(一些固定的汉字)。我将处理用户输入的汉字,所以我不能定义str,因为我不知道汉字会是什么。这有什么问题吗。如果您不理解
u8
前缀,这是您的问题,而不是答案错了
char str[MSG_LEN] = "\xE9\x85\x8D\xE7\xBD\xAE\xE6\x96\x87\xE4\xBB\xB6\xE4\xB8\xAD\xE5\x8C\x85\xE5\x90\xAB\xE4\xB8\xAD\xE6\x96\x87";
uint8_t str[] = 0xE9, 0x85, 0x8D, 0xE7, 0xBD, 0xAE, 0xE6, 0x96, 0x87, 0xE4, 0xBB, 0xB6,
                0xE4, 0xB8, 0xAD, 0xE5, 0x8C, 0x85, 0xE5, 0x90, 0xAB, 0xE4, 0xB8, 0xAD,
                0xE6, 0x96, 0x87, 0x00;
char str[] = u8"\u914D\u7F6E\u6587\u4EF6\u4E2D\u5305\u542B\u4E2D\u6587";