3

我已经用英语和希腊字符定义了相同的 char 数组。

char myText[]="ΗΤΙΑ ΗΤΙΑΑΑ ΛΟΥΛΟΥΔΙΑΣΜΕΝΗ!!!1234567890";
//  char myText[]="HTIA HTIAAA LOULOUDIASMENH!!!1234567890";

当我打印strlen(myText);char 数组的长度时,第一个具有希腊 UTF8 字符的长度为 63 个字符,而第二个具有 39 个字符。为什么会发生这种情况?谁可以解决这个问题,或者正确的问题是如何对希腊语 Unicode 希腊语字符进行语法处理,以便程序正确理解它们?

我将字符数组发送到 LED 矩阵,并且我的消息不会像字符为英文时那样显示在屏幕上。希腊字符或非 ASCII 字符似乎大于一个字节。

我有一个 switch 函数来检查字符并为每个字母返回一个适当的字节数组。我已经将 switch 的默认大小写设置为字符! 所以而不是得到HTIA HTIAI get !H!T!I!A!。所以我的开关将希腊字符理解为超过 1 个字节,并首先返回默认情况下的女巫!,然后返回正确的字符。

此外,当我尝试打印文本时,串行监视器上出现错误(字符显示不正确)。

4

2 回答 2

1

由于 UTF-8 字符可以有多个字节,而 strlen 只计算字节数,直到第一个空字符,strlen 将多算 UTF-8 字符串的长度。一种解决方案是使用mbstowcs()将字符串转换为宽字符串,然后使用 wcslen()获取宽字符串的长度。

PS这里是问题中提到的效果的演示。

于 2013-08-13T00:20:47.193 回答
0

UTF-8 是一种可变长度编码,因此有些字符只占用一个字节,而另一些则占用几个字节。

如果您正在使用语句逐字符处理字符串switch,那么您可能应该使用宽字符字符串:

#include <stddef.h>

wchar_t myText[]= L"ΗΤΙΑ ΗΤΙΑΑΑ ΛΟΥΛΟΥΔΙΑΣΜΕΝΗ!!!1234567890";

宽字符有 typewchar_t而不是char, 并且旨在足够大以存储当前语言环境中的任何单个字符。宽字符串常量以L字符为前缀。

在您的switch语句中,您可以在 case 表达式中使用宽字符常量(也以L字符为前缀):

switch (c)
{
    case L'Λ':
    /* handle capital lambda */
    break;

    case L'Α':
    /* handle capital A */
    break;

    /* ... */
}
于 2013-08-13T00:54:20.550 回答