2

RDF N-Triples规范规定必须对字符串文字进行编码。

https://www.w3.org/TR/n-triples/#grammar-production-STRING_LITERAL_QUOTE

这种“编码”是否有一个我可以查找以在我的编程语言中使用它的名称?如果不是,这在实践中意味着什么?

4

3 回答 3

4

您需要的语法产品就在您链接到的文档中:

[9] STRING_LITERAL_QUOTE    ::= '"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '"'
[141s]  BLANK_NODE_LABEL    ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)?
[10]    UCHAR   ::= '\u' HEX HEX HEX HEX | '\U' HEX HEX HEX HEX HEX HEX HEX HEX
[153s]  ECHAR   ::= '\' [tbnrf"'\]

这意味着字符串文字以双引号 (") 开头和结尾。在双引号内,您可以:

  • 任何字符,除了:#x22、#x5C、#xA、#xD。顺便说一下,我不知道它们中的每一个是什么,但我认为它们是转义中覆盖的空格字符;
  • 用 \u 后跟四个十六进制数字或 \U 后跟八个十六进制数字表示的 unicode 字符;或者
  • 一个转义字符,它是一个 \ 后跟 t、b、n、r、f、"、' 和 \ 中的任何一个,它们代表各种字符。
于 2016-11-27T22:21:25.677 回答
3

你可以使用Literal#n3()

例如

# pip install rdflib

>>> from rdflib import Literal
>>> lit = Literal('This "Literal" needs escaping!')
>>> s = lit.n3()
>>> print(s)
"This \"Literal\" needs escaping!"
于 2019-11-09T22:55:41.910 回答
1

除了乔希的回答。将 unicode 数据标准化为 NFC 几乎总是一个好主意,例如在 Java 中,您可以使用以下例程

java.text.Normalizer.normalize("rdf literal", Normalizer.Form.NFKC);

欲了解更多信息,请参阅: http: //www.macchiato.com/unicode/nfc-faq

什么是NFC?

由于各种原因,Unicode 有时对同一字符有多种表示形式。例如,以下每个序列(前两个是单字符序列)代表相同的字符:

U+00C5 ( Å ) LATIN CAPITAL LETTER A WITH RING ABOVE
U+212B ( Å ) ANGSTROM SIGN
U+0041 ( A ) LATIN CAPITAL LETTER A + U+030A ( ̊ ) COMBINING RING ABOVE

这些序列被称为规范等价。这些形式中的第一种称为 NFC - 用于规范化形式 C,其中 C 用于合成。有关这些的更多信息,请参阅 UAX #15: Unicode Normalization Forms 的介绍。将字符串 S 转换为 NFC 形式的函数可以缩写为 toNFC(S),而测试 S 是否在 NFC 中的函数缩写为 isNFC(S)。

于 2016-12-13T15:53:00.440 回答