【发布时间】:2019-06-19 00:02:09
【问题描述】:
我想索引不一定包含的 utf8 字符串中的字符 只有ASCII字符。我想要我在 javascript 中得到的同样的行为:
> str = "lλך" // i.e. Latin ell, Greek lambda, Hebrew lamedh
'lλך'
> str[0]
'l'
> str[1]
'λ'
> str[2]
'ך'
遵循UTF-8 Everywhere 的建议,我将我的混合字符长度字符串表示为与 c 中的任何其他字符串一样 - 并且不使用 wchars。
问题在于,在 C 语言中,无法访问字符串的第 16 个字符:只能访问第 16 个字节。因为λ 在utf-8 中用两个字节 编码,所以我必须访问字符串的第16 和第17 字节才能打印出一个λ。
供参考,输出:
#include <stdio.h>
int main () {
char word_with_greek[] = "this is lambda:_λ";
printf("%s\n",word_with_greek);
printf("The 0th character is: %c\n", word_with_greek[0]);
printf("The 15th character is: %c\n",word_with_greek[15]);
printf("The 16th character is: %c%c\n",word_with_greek[16],word_with_greek[17]);
return 0;
}
是:
this is lambda:_λ
The 0th character is: t
The 15th character is: _
The 16th character is: λ
有没有一种简单的方法可以将字符串分解成字符?编写一个将字符串分解为 wchars 的函数似乎并不难——但我想有人已经写过这个但我找不到它。
【问题讨论】:
-
which breaks a string into wchars不要。只是不要。 wchars 不是 解码 UTF-8 字符。 wchars 是另一种编码。如果您想/需要解码,则解码为 utf32 字符串。 -
几乎所有关于 Unicode 的事情都不是微不足道的。所以我建议你试着找一个图书馆(有几个)来帮助你。如果在此处询问库,但您可以尝试the software recommendation stack exchange site。
-
你的问题有点矛盾。你声明你想迭代一个字符串。这是 UTF-8 的一个非常自然的概念。您有一个指向字符串的指针和一个函数,该函数告诉您要跳过多少字节才能到达下一个字符。但是你想访问第 16 个字符。那是 索引访问 - 不是迭代。再次检查您的要求。通常不需要索引访问。很可能这只是您过去实现字符串处理的一个旧习惯。
-
迭代用于字符串处理。但是迭代不需要索引。要处理的字符的索引通常是无关紧要的。您只想访问迭代器当前位置的字符。 Unicode 的索引访问效率低下(参见 Schlemiel thepainter's Algorithm),使用当前位置的概念进行迭代很快。
-
字符没有快速简单的定义。 oᷔ 是单个字符吗?为什么或者为什么不? o͡e怎么样,有多少?