标签: grapheme

在Unicode中"组合字符"和"字形扩展器"之间有什么区别?

在Unicode中"组合字符""字形扩展器"之间有什么区别?

就我所知,他们似乎做了同样的事情 - 尽管一组字形扩展器比组合字符组大.我在这里显然遗漏了一些东西.为什么区别?


Unicode标准,第3章,D52

  • 组合字符:具有组合标记(M)的常规类别的字符.
  • 组合字符由所有字符组成,具有间距组合标记(Mc),非间距标记(Mn)和封闭标记(Me)的常规类别值.
  • 具有非零规范组合类的所有字符都组合字符,但反之则不然:存在组合字符与零规范组合类.
  • 私有字符(Co)作为组合字符或不组合字符的解释由实现决定.
  • 除非正在描述,否则这些字符通常不会单独使用.它们包括重音符号,变音符号,希伯来语点,阿拉伯元音符号和印度语母语等字符.
  • 组合字符的图形定位取决于最后一个基本字符,除非它们由既不是组合字符也不是零宽度连接符或零宽度非连接符的字符分隔.据说组合字符适用于该基本字符.
  • 可能没有这样的基本字符,例如当组合字符位于文本的开头或遵循控件或格式字符时 - 例如,回车符,制表符或左右标记.在这种情况下,组合字符称为隔离组合字符.
  • 对于孤立的组合字符或当进程不能执行图形组合时,进程可以呈现没有图形组合的组合字符; 也就是说,它可能会将其呈现为基本字符.
  • 组合字符的代表性图像在代码表中用虚线圆圈表示.当以与前面的基本字符的图形组合呈现时,该基本字符旨在出现在由虚线圆圈占据的位置中.

Unicode标准,第3章,D59

  • Grapheme扩展器:具有Grapheme_Extend属性的角色.
  • Grapheme扩展器字符包括所有非间距标记,零宽度连接器,零宽度非连接器,U + FF9E,U + FF9F和少量间距标记.
  • 可以将字形扩展器主要设想为在另一个间隔字符之上或之下应用的非间距图形标记.零宽度连接器和零宽度非连接器被正式定义为字形扩展器,因此它们的存在不会破坏一系列其他字形扩展器.
  • 具有Grapheme_Extend属性的少量间距标记是两部分组合标记的第二部分.
  • 根据定义,具有Grapheme_Extend属性的字符集和具有Grapheme_Base属性的字符集是不相交的.

unicode terminology grapheme combining-marks

13
推荐指数
1
解决办法
1776
查看次数

获得字素的正确方法是什么?

为什么要打印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)

regex unicode perl grapheme

7
推荐指数
1
解决办法
393
查看次数

如何计算Java中的字素簇或“感知”表情符号字符

我正在计算提供的Java字符串中可感知的表情符号字符的数量。我目前正在使用emoji4j库,但不适用于像这样的字素簇:???

调用EmojiUtil.getLength("???")return 4代替1,类似地调用EmojiUtil.getLength("???")return 5代替2

StringJava中是否有任何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类似的东西"???"

java character emoji grapheme

6
推荐指数
2
解决办法
1192
查看次数

在javascript字符串中获取字形字符数?

我试图在用户可见的字形中获取javascript字符串的长度,即忽略组合字符(和代理对?).这是可能的,如果是的话,我该怎么做呢?

我们在项目中使用了dojo工具包,但任何通用的JavaScript解决方案都会很棒.

javascript unicode grapheme

4
推荐指数
3
解决办法
1665
查看次数

为什么Swift将这个Grapheme Cluster计为两个字符而不是一个?

一般来说,Swift 非常聪明地将字形集合计为单个字符.例如,如果我想制作黎巴嫩旗帜,我可以将两个Unicode字符组合在一起

  • U + 1F1F1区域指标符号L
  • U + 1F1E7区域指标符号字母B

正如预期的那样,这是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的自行车表情符号.如果我结合起来

  • U + 1F6B4自行车手
  • U + 1F3FE EMOJI MODIFIER 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的原因,请注意该群集实际上被解释为有效的表情符号:

在此输入图像描述

unicode emoji grapheme swift

4
推荐指数
1
解决办法
1237
查看次数

如何检查UTF-8字符串是否以'a'开头

我有一个以空终止的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解析器)如何设法解析文件而不能回答这类问题?

c unicode utf-8 grapheme

3
推荐指数
1
解决办法
142
查看次数

在 Python 3 中,计算泰语字符位置

第一,我使用了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 …

python unicode python-3.x thai grapheme

3
推荐指数
1
解决办法
426
查看次数