问题标签 [grapheme]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1766 浏览

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

一般来说,Swift非常聪明地将字素簇计算为单个字符。例如,如果我想制作黎巴嫩国旗,我可以将两个 Unicode 字符组合起来

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

正如预期的那样,这是 Swift 中的一个字符:

但是,假设我想做一个 Fitzpatrick Type-5 的自行车表情符号。如果我结合

  • U+1F6B4 自行车
  • U+1F3FE 表情修饰符 FITZPATRICK TYPE-5

斯威夫特将此组合视为两个字符!

为什么这是两个字符而不是一个?

为了说明为什么我希望它是 1,请注意这个集群实际上被解释为一个有效的表情符号:

在此处输入图像描述

0 投票
2 回答
201 浏览

python - 给定一个 Unicode 代码点列表,如何将它们拆分为 Unicode 字符列表?

我正在为 Unicode 文本编写一个词法分析器。许多 Unicode 字符需要多个代码点(即使在规范组合之后)。例如,tuple(map(ord, unicodedata.normalize('NFC', 'ā́')))计算结果为(257, 769)。我怎么知道两个字符之间的边界在哪里?此外,我想存储文本的非规范化版本。我的输入保证是 Unicode。

到目前为止,这就是我所拥有的:

这会错误地打印以下内容:

我希望它打印以下内容:

0 投票
1 回答
64 浏览

regex - 如何通过降低时间复杂度从 Matlab 中的字符串中制定英文字素?

我一直在 Matlab 中进行字素到音素的转换,并尝试生成一个更通用的代码,以首先将单词分解为特定的辅音、二合字母及其相关元音,并将每个输入的字符串(单词)分割成它的字素形式,以便它可以在以后产生适当的语音合成。然而,由于存在大量规则,因此存在大量 if-elseif-else,循环遍历每个字母并存在不断增长的数组,时间复杂度增加了很多,并且没有给出任何结果(它显示繁忙,每次我通过控制台输入字符串时)。所以如果你能帮我简化代码,下面是:

0 投票
1 回答
2646 浏览

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

我正在计算提供的 Java 字符串中感知到的表情符号字符的数量。我目前正在使用emoji4j库,但它不适用于像这样的字素集群:‍‍‍</p>

调用EmojiUtil.getLength("‍‍‍")return4而不是1,同样调用EmojiUtil.getLength("‍‍‍")return5而不是2

Java中是否有任何API或方法String可以轻松计算字素簇?

我一直在寻找,但可以理解的是codePoints(),a 上的方法String不仅包括可见的表情符号,还包括零宽度连接器。

我也尝试过使用BreakIterator

但它的行为似乎与该codePoints()方法相同,返回8类似"‍‍‍".

0 投票
1 回答
1121 浏览

c++ - C++ Unicode:字节、代码点和字形

所以,我正在构建一种脚本语言,我的目标之一是方便的字符串操作。我在 C++ 中尝试了一些想法。

  • 字符串作为字节序列和返回包含代码点索引的向量的自由函数。
  • 一个包装类,它结合了一个字符串和一个包含索引的向量。

两种想法都有问题,问题是,我应该返回什么。它不能是一个字符,如果它是一个字符串,那将是浪费空间。

我最终围绕一个正好 4 个字节的 char 数组创建了一个包装类:一个在内存中正好有 4 个字节的字符串,不多也不少。

在创建这个类之后,我很想将它包装std::vector在另一个类中并从那里构建,从而制作一个字符串类型的代码点。我不知道这是否是一个好方法,它最终会更方便,但最终会浪费更多空间。

因此,在发布一些代码之前,这里有一个更有条理的想法列表。

  • 我的字符类型不是字节,也不是字素,而是代码点。我把它命名为一个符文,就像 Go 语言中的符文一样。
  • 一个字符串作为一系列分解的符文,从而对 O1 进行索引和切片。
  • 因为 rune 现在是一个类而不是原始类型,所以可以使用检测 unicode 空格的方法对其进行扩展:mysring[0].is_whitespace()
  • 我仍然不知道如何处理字素。

奇怪的事实!我构建 rune 类原型的方式的一个奇怪之处在于它总是以 UTF8 打印。因为我的 rune 不是 int32,而是一个 4 字节的字符串,所以最终会有一些有趣的属性。

我的代码:

错误处理思路:

我不喜欢在 C++ 中使用异常。我的想法是,如果构造函数失败,则将 rune 初始化为 4 '\0',然后显式重载 bool 运算符以在运行的第一个字节恰好是 时返回 false '\0'。简单易用。

那么,想法?意见?不同的方法?

就算我的符文串很多,至少我还有符文类型。小而快复制。:)

0 投票
1 回答
161 浏览

java - Java中的字形搜索

所以我正在做一个项目,该项目涉及搜索不同语言的单词。我可以很容易地获得该语言的语言环境,但我不知道如何用另一种语言搜索这个词。所以文本可以是中文,要搜索的词可以是英文。例如,在 php 中,我们有grapheme_stripos,我正在寻找 Java 中的类似功能。我还没有找到在java中进行字素搜索的任何东西。因此,一种方法可能是分解字符串并将其存储在一个字节数组中并通过它进行搜索,但是在 php 中是否有更好的东西来解决这个目的?

0 投票
4 回答
229 浏览

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

我有一个以 null 结尾的 UTF-8 字符串const char*。我想知道这个字符串的第一个字母是否是一个单独的字母a。以下代码

是错误的,因为字符串的第一个字母(字素簇)可能是à- 由 2 个 unicode 标量值组成:a`. 所以这个非常简单的问题似乎很难回答,除非你知道字素簇是如何制作的。

尽管如此,许多库解析 UTF-8 文件(例如 YAML 文件),因此应该能够回答这类问题。但是这些库似乎并不依赖于 Unicode 库。

所以我的问题是:

  • 如何编写检查字符串是否以字母开头的代码a

  • 假设第一个问题没有简单的答案,解析器(如 YAML 解析器)如何在无法回答此类问题的情况下设法解析文件?

0 投票
1 回答
139 浏览

sql - SQL 长度函数如何处理 unicode 字素?

考虑以下场景,其中我有\U00000045\U00000301.

1) https://www.fileformat.info/info/unicode/char/0045/index.htm
2) https://www.fileformat.info/info/unicode/char/0301/index.htm

受约束的表varchar(1)是否会将其视为有效的 1 个字符输入。还是会因为它被认为是 2 个字符输入而被拒绝?

SQL 通常如何处理带有字素的字符串的长度?

0 投票
1 回答
120 浏览

arrays - Swift String.Index 与将字符串转换为数组

在 swift 文档中,他们说他们使用 String.Index 来索引字符串,因为不同的字符可以占用不同的内存量。

但是我看到很多人将 String 转换为数组var a = Array(s),以便他们可以通过 int 而不是 String.Index 进行索引(这绝对更容易)

所以我想自己测试一下它是否对所有 unicode 字符都完全相同:

这是输出:

果然,正如文档中提到的那样,字符串只是一个字符数组,然后字素簇在字符对象中向下,那么他们为什么不通过 int 对其进行索引呢?实际上创建/使用 String.Index 有什么意义?

0 投票
0 回答
21 浏览

unicode - 我可以用变音符号覆盖某些字素的默认呈现吗?

我正在寻找将两个 U+0307 COMBINING DOT ABOVE 字符添加到西里尔字母。当添加到拉丁字母时,点变音符号堆叠,但使用西里尔字母时,第一个点与字母组合,但第二个呈现到侧面,就好像它是一个独立的字素!在 Python 中:

在此处输入图像描述

同样的事情发生在 JavaScript 中,甚至在浏览器中:

在此处输入图像描述

是否有规定某个基本字符允许使用多少个变音符号?这与字体指标有关吗?或者这种效果只是一个错误?可以覆盖它以便我可以看到两个点垂直堆叠在э上吗?