自定义文本处理的可用Unicode范围

时间:2016-09-04 22:42:48

标签: text unicode text-processing unicode-range

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

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
  • First \ E002表示元素类型编号,其最后一位表示元素的关闭。因此元素编号以+2递增。
  • 秒\ 0001表示堆叠的元素索引。
  • 我刚刚使用了\ E002这个例子无关紧要。

但是\ 0001也在Unicode Range中使用,这导致我再次开始......

那么我可以使用哪个unicode系列? \ FF0000?或者我该如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

Unicode Consortium想到了这一点。有一系列的Unicode代码点意味着从不代表可显示的字符,而是使用元代码:

  

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

你应该可以使用常规控制字符作为"私人"标签,因为这些不应该出现在正确的字符串中。这是从U+0000U+001F的范围,不包括标签(U+0009),常见"返回" (U+000AU+000D),为安全起见,U+0000本身(某些库不喜欢字符串中间的空字符)。

  

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

您可以使用U+FEFF(目前正式定义为非字符),或U+FFFEU+FFFF。还有几个&#34;官方不是一个字符&#34;已定义,您可以相当确定它们不会出现在常规文本字符串中。

一些具有预定义定义的随机序列,因此在纯文本字符串中不太可能出现:

  

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

     

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

     

标签字符:U + E0000-U + E007F
  该块对一组95个特殊用途的标记字符进行编码,以便能够拼写出基于ASCII的字符   字符串标记使用可以与普通文本内容严格分开的字符   Unicode中的字符   (上述章节中的所有引文

遵守约定,您还可以使用U+2028(行分隔符)和/或U+2029段落分隔符。

从技术上讲,您使用U+E000 - U+F8FF(&#34;私人使用区&#34;)是可以的,因为这些代码点只能定义一个明确的字符与某个字体。但是,如果从包含 字体的源获取纯文本,则可能会弹出这些代码。

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

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