如何编码RDF N-Triples字符串文字?

时间:2016-11-27 11:39:20

标签: string encoding rdf literals n-triples

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

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

这是"编码"有一个名字我可以在我的编程语言中使用它吗?如果没有,那在实践中意味着什么?

3 个答案:

答案 0 :(得分: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后跟四个十六进制数字表示的unicode字符,或者\ u后跟八个十六进制数字;或
  • 一个转义字符,它是一个\后跟t,b,n,r,f,",'和\中的任意一个,代表各种字符。

答案 1 :(得分: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规范化表单的介绍。将字符串S转换为NFC形式的功能可以缩写为NFC(S),而测试S是否在NFC中的功能缩写为isNFC(S)。

答案 2 :(得分:1)

您可以使用Literal#n3()

例如

# pip install rdflib

>>> from rdflib import Literal
>>> lit = Literal('This "Literal" needs escaping!')
>>> s = lit.n3()
>>> print(s)
"This \"Literal\" needs escaping!"