快板图 - N 三元组中的 UTF-8 字符



当我使用 AllegroGraph 4.6 Python API 时,我可以使用 connection.addTriple() 方法尝试添加一个以包含 unicode 字符 (×) 的文本结尾的三元组:

conn.addTriple( ..., ..., '5 × 10**5' )

这行不通。 我收到错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position...

以下是完整的回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/repository/repositoryconnection.py", line 357, in addTriple
    self._convert_term_to_mini_term(obj), cxt)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/repository/repositoryconnection.py", line 235, in _convert_term_to_mini_term
    return self._to_ntriples(term)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/repository/repositoryconnection.py", line 367, in _to_ntriples
    else: return term.toNTriples();
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/model/literal.py", line 182, in toNTriples
    sb.append(strings.encode_ntriple_string(self.getLabel()))
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/util/strings.py", line 52, in encode_ntriple_string
    string = unicode(string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 18: ordinal not in range(128)

相反,我可以像这样添加三元组:

conn.addTriple( ..., ..., u'5 × 10**5' )

这样我就不会收到错误。

但是,如果我使用 connection.addFile(filename, format=RDFFormat.NTRIPLES) 加载包含一些 UTF-8 编码字符的 ntriples 文件,如果 ntriples 文件从记事本++保存为 ANSI 编码,则会收到此错误消息:

400 MALFORMED DATA: N-Triples parser error while parsing
#<http request stream @ #x10046f9ea2> at line 12764 (last character was
#×): nil
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/repository/repositoryconnection.py", line 341, in addFile
    commitEvery=self.add_commit_size)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/miniclient/repository.py", line 342, in loadFile
    nullRequest(self, "POST", "/statements?" + params, body, contentType=mime)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/miniclient/request.py", line 198, in nullRequest
    if (status < 200 or status > 204): raise RequestError(status, body)
franz.miniclient.request.RequestError: Server returned 400: N-Triples parser error while parsing

如果文件保存为 UTF-8 编码,我会收到此错误消息:

400 MALFORMED DATA: N-Triples parser error while parsing
#<http request stream @ #x100486e8b2> at line 1 (last character was
#): Subjects must be resources (i.e., URIs or blank nodes)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/openrdf/repository/repositoryconnection.py", line 341, in addFile
    commitEvery=self.add_commit_size)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/miniclient/repository.py", line 342, in loadFile
    nullRequest(self, "POST", "/statements?" + params, body, contentType=mime)
  File "/cygdrive/c/agraph-4.6-client-python/src2/franz/miniclient/request.py", line 198, in nullRequest
    if (status < 200 or status > 204): raise RequestError(status, body)
franz.miniclient.request.RequestError: Server returned 400: N-Triples parser error while parsing

但是,如果文件在记事本++中设置为ANSI编码,我可以进入并粘贴×字符,保存,然后文件加载正常。 或者,如果我在粘贴字符后将文件编码更改为 UTF-8,则该字符将更改为某个奇怪的 xD7 字符。 如果文件设置为 UTF-8 编码并且我将×粘贴到其中,那么如果我将编码更改为 ANSI,则×将更改为×

当文件交给我时,它× ×应该在的位置,当我尝试在 AllegroGraph 中加载它时,我得到了第一个 400 格式错误的数据错误,该错误在字符实际出现在文件中的行 (12764) 失败,而不仅仅是在第一行。 我假设我在第 1 行收到第二个 400 格式错误的数据错误的原因与记事本++为 UTF-8 编码文件编写的标头有关。 所以显然,如果我希望 AllegroGraph 不会立即打嗝,我必须将文件保存为 ANSI,但必须有某种方法告诉 AllegroGraph 将×读取为 UTF-8 字符之类的内容。

在文件中,三元组如下所示:

<...some subject URI...> <...some predicate URI...> "5 × 10**5" .

xd7×的拉丁语-1编码。

如果您错误地将×解码为 cp1252(通常是 Windows 的默认编解码器),如果它以 UTF-8 编码,您将获得×

当您获得显示×的文件时,请尝试将用于显示它们的编解码器更改为 UTF-8。


有关 Python 中 Unicode 的概述,请参见此处。 ~ 感谢 Daenyth。


正如您从 AllegroGraph 支持中发现的那样:

AllegroGraph 可以使用 \uXXXX 获取 nTriples 中的 unicode 字符 表示法。或者,可以使用RDFXML,它允许您离开 按原样对字符进行统一编码。

使用编解码器模块。

import codecs
f = codecs.open('file.txt','r','utf8')

这将打开您的文件,强制使用 UTF8 编码

相关内容

  • 没有找到相关文章

最新更新