1

我正在开发一个处理器,它将文本分成带有标记的块:

LOREM IPSUM SED AMED

将被解析为:

{word:1}LOREM{/word:1}{space:2}
{word:3}IPSUM{/word:3}{space:4}
{word:5}SED{/word:5}{space:6}
{word:7}AMED{/word:7}

但我不想使用“{word}”等,因为它会导致处理器停机,因为它又是一个字符串......我需要像这样标记:

\E002\0001 LOREM \E003\0001 \E004\0002
\E002\0003 IPSUM \E003\0004 \E004\0005
\E002\0006 SED   \E003\0006 \E004\0007
\E002\0008 AMED  \E003\0008
  • 第一个\E002 表示元素类型号,它的最后一位代表元素的关闭。因此元素编号以 +2 递增。
  • 第二个 \0001 表示用于堆叠的元素索引。
  • 我只是在这个例子中不相关地使用了 \E002。

但是 \0001 也在 Unicode Range 中使用,这让我重新开始......

那么我可以使用哪个 unicode 范围?\ff0000? 或者我该如何解决这个问题?

谢谢!

4

1 回答 1

1

Unicode 联盟想到了这一点。有一系列 Unicode 代码点永远不会代表可显示的字符,而是元代码:

非字符是永久保留的代码点,永远不会分配给它们的字符。
...
标记字符旨在支持在没有其他机制(例如标记语言)的情况下对文本流进行内部标记的通用方案。不推荐使用标记字符进行语言标记。
http://www.unicode.org/versions/Unicode9.0.0/ch23.pdf

您应该能够使用常规控制字符作为“私有”标签,因为这些字符永远不会出现在正确的字符串中。这将是从U+0000to的范围U+001F,不包括制表符 ( U+0009)、常见的“返回”( U+000Aand U+000D),以及为了安全起见U+0000本身(一些库不喜欢字符串中间的 Null 字符)。

非字符 非字符
是 Unicode 标准中永久保留供内部使用的代码点。不建议将它们用于 Unicode 文本数据的开放交换。

您可以使用U+FEFF(目前官方定义为 Not-A-Character),或U+FFFEand U+FFFF。定义了更多“官方非字符”,您可以相当确定它们不会出现在常规文本字符串中。

一些具有预定义定义且极不可能出现在纯文本字符串中的随机序列是:

特殊:U+FFF0–U+FFF8
U+FFF0..U+FFF8 范围内的九个未分配的 Unicode 代码点保留用于特殊字符定义。

注释字符:U+FFF9–U+FFFB 行
间注释由与注释字符序列相关的注释文本组成。对于所有常规编辑和文本处理算法,带注释的字符被视为文本流的一部分。注释文本也是内容的一部分,但对于所有或部分文本处理,它不构成主要文本流的一部分。

标记字符:U+E0000–U+E007F
此块编码一组 95 个特殊用途标记字符,以便使用可以与 Unicode 中的普通文本内容字符严格分开的字符来拼写基于 ASCII 的字符串标记。
以上章节的所有引文


按照惯例,您还可以使用U+2028(行分隔符)和/或U+2029段落分隔符。

从技术上讲,您使用U+E000–<code>U+F8FF(“私人使用区域”)是可以的,因为这些代码点只能定义一个明确的字符与某种字体组合。但是,如果您从包含字体的来源获取纯文本,则可能会弹出这些代码。

至于如何将其编码到您的字符串中:紧跟在您的私有标签标记之后的数字代码是否是有效的 Unicode 字符并不重要。如果您看到自己的标签标记之一,那么紧随其后的值始终是您自己的私有序列号。

如您所见,有很多可能性。我想最重要的标准是你是否想在这些字符串上使用其他函数。如果您创建的字符串在技术上是无效的 Unicode(例如,因为它包含非字符值),某些外部函数可能会选择无法处理它们,或者默默地删除错误值。在这种情况下,您需要严格遵守只使用“有效”代码点的系统。

于 2016-09-04T23:12:05.857 回答