在Unicode中"组合字符"和"字形扩展器"之间有什么区别?
就我所知,他们似乎做了同样的事情 - 尽管一组字形扩展器比组合字符组大.我在这里显然遗漏了一些东西.为什么区别?
为什么要打印U
而不是Ü
?
#!/usr/bin/env perl
use warnings;
use 5.014;
use utf8;
binmode STDOUT, ':utf8';
use charnames qw(:full);
my $string = "\N{LATIN CAPITAL LETTER U}\N{COMBINING DIAERESIS}";
while ( $string =~ /(\X)/g ) {
say $1;
}
# Output: U
Run Code Online (Sandbox Code Playgroud) 我正在计算提供的Java字符串中可感知的表情符号字符的数量。我目前正在使用emoji4j库,但不适用于像这样的字素簇:???
调用EmojiUtil.getLength("???")
return 4
代替1
,类似地调用EmojiUtil.getLength("???")
return 5
代替2
。
String
Java中是否有任何API或方法可以简化字素簇的计数?
我一直在寻找,但可以理解的是codePoints()
,a上的方法String
不仅包括可见的表情符号,还包括零宽度的连接符。
我也尝试使用BreakIterator
:
public static int getLength(String emoji) {
BreakIterator it = BreakIterator.getCharacterInstance();
it.setText(emoji);
int emojiCount = 0;
while (it.next() != BreakIterator.DONE) {
emojiCount++;
}
return emojiCount;
}
Run Code Online (Sandbox Code Playgroud)
但是它的行为似乎与codePoints()
方法相同,返回8
类似的东西"???"
。
我试图在用户可见的字形中获取javascript字符串的长度,即忽略组合字符(和代理对?).这是可能的,如果是的话,我该怎么做呢?
我们在项目中使用了dojo工具包,但任何通用的JavaScript解决方案都会很棒.
一般来说,Swift 非常聪明地将字形集合计为单个字符.例如,如果我想制作黎巴嫩旗帜,我可以将两个Unicode字符组合在一起
正如预期的那样,这是Swift中的一个角色:
let s = "\u{1f1f1}\u{1f1e7}"
assert(s.characters.count == 1)
assert(s.utf16.count == 4)
assert(s.utf8.count == 8)
Run Code Online (Sandbox Code Playgroud)
但是,假设我想制作Fitzpatrick Type-5的自行车表情符号.如果我结合起来
Swift将此组合计为两个字符!
let s = "\u{1f6b4}\u{1f3fe}"
assert(s.characters.count == 2) // <----- WHY?
assert(s.utf16.count == 4)
assert(s.utf8.count == 8)
Run Code Online (Sandbox Code Playgroud)
为什么这两个字符而不是一个?
为了说明我期望它为1的原因,请注意该群集实际上被解释为有效的表情符号:
我有一个以空终止的UTF-8字符串const char*
.我想知道这个字符串的第一个字母是a
单独的.以下代码
bool f(const char* s) {
return s[0] == 'a';
}
Run Code Online (Sandbox Code Playgroud)
是错误的,因为字符串的第一个字母(字形集群)可能是à
- 由2个unicode标量值组成:a
和`
.所以这个非常简单的问题似乎很难回答,除非你知道如何制作字形集群.
尽管如此,许多库解析UTF-8文件(例如YAML文件),因此应该能够回答这类问题.但是这些库似乎并不依赖于Unicode库.
所以我的问题是:
如何编写检查字符串是否以字母开头的代码a
?
假设第一个问题没有简单的答案,解析器(如YAML解析器)如何设法解析文件而不能回答这类问题?
第一,我使用了Python 3字形库,以解决我的问题。(有关grapheme 的更多信息,请参阅本文)。但令我惊讶的是,如果没有专门的库,Python 3 无法做到这一点......
我使出字形,因为经过多次网络搜索和StackOverflow的问题阅读,我不能让Python 3里返回正确数量的字符位置在泰国字符的序列。
例如,这是一个 UTF-8 泰语字符串:
thai_str = '????????????????? ???????????????????????????'
Run Code Online (Sandbox Code Playgroud)
我使用术语字符位置来标识泰语字符行/字符串中的单个位置。这是因为字符位置可能由泰语辅音加上,在某些情况下,辅音上方或下方的元音或声调标记组成。辅音加上上方/下方的元音或声调标记在 Unicode 字符串中占据单个字符位置。(一些泰语辅音也可能在左边、右边或两者都有元音。这些元音占据他们自己的字符位置。)
例如,在从示例字符串生成的以下序列中,项目 2 和 7 是元音,项目 10 是音调标记。每个使用 UTF-8 字符串中的单独字节,但不占用自己的字符位置。第 3 项和第 8 项是元音,位于辅音左侧,因此占据字符位置。
01: ?
02: ?
03: ?
04: ?
05: ?
06: ?
07: ?
08: ?
09: ?
10: ?
...
45: ?
Run Code Online (Sandbox Code Playgroud)
尝试确定示例字符串中的字符位置时,len(thai_str)
返回45
. 这是不正确的。我能够获得正确数量的字符位置的唯一方法是使用grapheme.length(thai_str)
get 35
。
我还使用了 encode …
grapheme ×7
unicode ×6
emoji ×2
c ×1
character ×1
java ×1
javascript ×1
perl ×1
python ×1
python-3.x ×1
regex ×1
swift ×1
terminology ×1
thai ×1
utf-8 ×1