gpt4 book ai didi

c - 非 ASCII 字符集作为 C 字符串

转载 作者:行者123 更新时间:2023-12-05 03:24:18 25 4
gpt4 key购买 nike

我正在开发一个支持多语言的软件。我必须使用一字节字符集。这意味着我不能使用 UTF-8 编码格式。我的编码格式是这些:

  • 英语:ASCII
  • 乌克兰:KOI8-U
  • ARA:ISO8859-6
  • SPA:ISO8859-1

我使用 notepad++ 作为我的编辑器。当我收到一种新语言的翻译时,我只是简单地增加我的数组大小并将 C 文件的编码格式更改为新语言的编码格式。例如,对于不同的编码类型,我的数组看起来像这样:

#define MAX_CHAR_PER_LINE 10
enum Langs {
en,
uk,
es,
ar
MAX_LANG
};

// ASCII
const char settingStr[][MAX_LANG][MAX_CHAR_PER_LINE] = {
//...
{ "SETTINGS", "îáìáûôõ÷áîîñ", "AJUSTES", "ÇÙÏÇÏÇÊ" },
//...
};

// KOI8-U
const char settingStr[][MAX_LANG][MAX_CHAR_PER_LINE] = {
//...
{ "SETTINGS", "НАЛАШТУВАННЯ", "AJUSTES", "гыогогй" },
//...
};
// ISO8859-6
const char settingStr[][MAX_LANG][MAX_CHAR_PER_LINE] = {
//...
{ "SETTINGS", "ففََّ", "AJUSTES", "اعدادات" },
//...
};

当我用十六进制查看器检查 C 文件时,我会确保字符的二进制值根据指定的编码标准是正确的。我的问题是我收到如下编译警告:

enter image description here

还有运行时的逻辑错误。

在线 gdb 的示例代码是:

#include <stdio.h>

const char settingStr[][4][10] = {
//...
{ "SETTINGS", "ففََّ", "ÇÙÏÇÏÇÊ", "AJUSTES" },
//...
};

int main() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 10; j++)
printf("0x%02X,", settingStr[0][i][j]);
printf("\n");
}
return 0;
}

我怀疑 gcc 预处理器无法解析这些字符串。我应该添加某种编译器标志吗?我不想用十六进制值填充我的数组。

最佳答案

编译器错误消息具有误导性:字符串 "ÇÙÏÇÏÇÊ" 可能以 UTF-8 编码(在传输过程中由您的编辑器或其他工具编码)并使用 14 个字节(加上空终止符) .编译器指向错误(字符串中的第 6 个字符)但终端支持 UTF-8 并且 "ÇÙÏÇÏÇÊ" 的 14 个字节仅显示为 7 个字符,未对齐 ^~~ ~~~~ 在下一行输出。另一个字符串 "فف̶ّ" 也可能被错误编码,导致额外的错位。

问题是你的编辑环境:译文以UTF-8编码返回给你,这是今天的事实标准,更准确地说,它可能被编码了两次:原始的ISO8859-6 1字节编码对于阿拉伯语,错误地从 ISO8859-1 以 UTF-8 重新编码。

您不能轻易地在同一个文件中混合使用不同的编码。这让每个人都很困惑:翻译者、程序员、编译器、用户……

以下是避免这些问题的不同选项:

  • 您应该认真重新考虑设计选择并使用 UTF-8。所有翻译的源代码将以所有语言可读,更安全,更易于审计。根据运行时环境,这可能会简化或复杂化显示。

  • 您可以将每个翻译的字符串存储在一个单独的文件中,每个翻译都使用适当的编码进行编码,并在运行时检索它们。这对翻译人员更友好,但需要对软件进行重大更改。

  • 您可以使用八进制或十六进制转义序列对已翻译的字符串进行 ASCII 编码,以避免重新编码问题。这将避免重新编码问题和任何编译器对远东国家使用的历史编码的误解。您可以使用一个小程序将字符串编码为 C 源代码。

关于c - 非 ASCII 字符集作为 C 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72315362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com