rdf n-triples的规范指出必须编码字符串文字。
https://www.w3.org/tr/n-triples/#grammar-production-string_literal_quote
这个"编码"是否有一个可以在编程语言中使用的名称?如果不是,那么在实践中意味着什么?
您需要的语法作品在您链接到的文档中正确:
[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,'和的任何一个代表各种字符的t,b,n,r,f,'和。
您可以使用文字#n3()
,例如
# pip install rdflib
>>> from rdflib import Literal
>>> lit = Literal('This "Literal" needs escaping!')
>>> s = lit.n3()
>>> print(s)
"This "Literal" needs escaping!"
除了乔什的答案。将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,其中c用于堆肥。有关这些信息的更多信息,请参见UAX#15的引入:Unicode归一化形式。将字符串s转换为NFC形式的功能可以缩写为Tonfc(S),而测试S中是否在NFC中的函数缩写为ISNFC(S)。