【问题标题】:How to encode RDF N-Triples string literals?如何编码 RDF N-Triples 字符串文字?
【发布时间】:2017-04-11 05:49:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: string encoding rdf literals n-triples


    【解决方案1】:

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

    [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。顺便说一下,我不知道每个是什么,但我认为它们是转义中的空格字符;
    • 一个 unicode 字符,用 \u 后跟四个十六进制数字,或 \U 后跟八个十六进制数字表示;或
    • 转义字符,它是一个 \ 后跟 t、b、n、r、f、"、' 和 \ 中的任何一个,代表各种字符。

    【讨论】:

    • #x22 = ", #x5C = \, #xA = 换行,#xD = 回车,所以我猜这4个需要转义
    【解决方案2】:

    你可以使用Literal#n3()

    例如

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

    【讨论】:

      【解决方案3】:

      除了乔希的回答。将 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-11-30
        • 2021-09-25
        • 2012-06-14
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 2016-04-05
        相关资源
        最近更新 更多