1

我正在尝试以 CouchDB 作为后端编写一个完全兼容 utf-8 的应用程序。我使用 c++ 和 casablanca rest sdk 将我的请求发送到 Couch 版本 1.6.1。为了测试应用程序是否可以处理各种 unicode 字符,我在一个 JSON 对象中有一个测试字符串,我想把它放到 Couch 上。字符串格式如下(c++)

const string_t InternationalText = 
L"Hello world!123#@%\n\r\v\t\f Å i åa ä e ö 
\u00c5 \u00fc \u03bb \u0416 \u4e16\u754c\u548c\u5e73 \U00013080";

字符串中的最后一个字符 \U00013080 荷鲁斯之眼给我带来了麻烦。我收到来自 Couch 的 400 错误请求,如果查看日志,我会看到错误“词法错误:字符串中的无效字符”。

我已经使用 RawCap 进行了一些嗅探来捕获请求 - 响应周期和我的请求的重要部分是:

PUT *address*
Content-Type: application/json;charset=utf-8
Body: *Complex Json object containing the string as such*

{"description"="Hello world!123#@% Å i åa ä e ö Å ü λ Ж 世界和平 ",...}

如果我查看请求的十六进制,荷鲁斯之眼字符被编码为 F0 93 82 80,根据https://codepoints.net/U+13080是正确的。不过,我得到了 UTF-8 错误。我错过了什么?CouchDB 在处理 unicode 标准中平面 1+ 的字符时是否有问题?

几乎不用说,如果我删除象形文字,一切都会很好。

4

1 回答 1

2

我发现了问题。原来 \v 是 JSON 的非法字符,https://www.rfc-editor.org/rfc/rfc7159,删除它可以解决我的问题。当我删除测试字符串中的最后一个字符时,Visual Studio 的单元测试框架中的一些奇怪行为通过了测试,即使调用中仍然存在错误,我也感到很震惊。

于 2015-05-18T18:46:04.407 回答