【问题标题】:English and Greek UTF characters difference英语和希腊语 UTF 字符的区别
【发布时间】:2013-08-14 10:55:06
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你的length 函数是什么样的?发布它。
  • 似乎是合理的......你有什么问题? (显然非 ASCII 字符在 UTF8 中更长,所以...)
  • 如果我以 \uXXXX unicode 格式提供它,这会得到解决吗?也不应该是 8bit,因为它是 UTF8?
  • " 不应该是 8 位,因为它是 UTF8?" :) - 不知道你到底是什么意思...考虑阅读一些关于 UnicodeUTF8
  • 我很好奇您如何期望 8 位代表大约十万个可能的值...

标签: c++ c eclipse optimization arduino


【解决方案1】:

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

附: Here是问题中提到的效果的演示。

【讨论】:

  • 好吧,我想将阵列发送到 LED 屏幕,我有功能可以做到这一点,但我看到每次发送希腊字符或非 AScii 时,我都会得到 2 个字节,第一个字节是错误的,并且第二个是希腊语中的确切字符
【解决方案2】:

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

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

#include <stddef.h>

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

宽字符的类型为wchar_t 而不是char,其大小足以存储当前语言环境中的任何单个字符。宽字符串常量以L 字符为前缀。

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

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

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

    /* ... */
}

【讨论】:

  • 虽然我包含了 stddef.h,但我知道 wcslen() 无法解析,但它在我可以使用的函数列表中。
  • @kyrpav: wcslen()wchar.h 中声明。如果包含wchar.h,则也不需要stddef.h
  • 虽然我已经包含 wcharacter.h 它仍然无法识别该功能
  • @kyrpav 试试#include &lt;cwchar&gt;
  • :( 抱歉,这对不存在的库 exept 不起作用,它们也会在 wcslen() 函数中出现此错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多