Eve + MongoDB 带有特殊字符

Eve + MongoDB with special characters

我有一个 (Mongo) 数据库,其中包含来自多个 planets/moons/asteroids 的位置。 我的数据库名为 nomenclature,集合为 centroids。 这是此集合中的文档示例:

[
{
  "name":"kachina chasmata",
  "location":{
    "type":"Point",
    "coordinates":[-116.65,-32.6]
  },
  "body":"ariel"
},
{
  "name":"hokusai",
  "location":{
    "type":"Point",
    "coordinates":[16.65,57.84]
  },
  "body":"mercury"
},
{
  "name":"cañas",
  "location":{
    "type":"Point",
    "coordinates":[89.86,-31.188]
  },
  "body":"mars"
},
{
  "name":"anseris cavus",
  "location":{
    "type":"Point",
    "coordinates":[95.5,-29.708]
  },
  "body":"mars"
}
]

这样的 db/collection 将收到对其 bodyname 字段的查询。

您可能已经注意到空格和特殊字符 ("ñ") in (name ) 一些文档。 这正是我的问题所在。

我正在使用 eve 通过只读 (GET) 界面发布此 db/collection。 在设置中使用以下DOMAIN

DOMAIN = {
    'centroids': {
        'item_title': 'crater centroid',
        'url': 'centroid/<regex("[\w]+"):body>/<regex("[\w ]+"):name>'
    }
}

,Eve 对这样的请求回答得很好:

$ curl 'http://127.0.0.1:5000/centroid/mercury/hokusai'

或者,

$ curl 'http://127.0.0.1:5000/centroid/mars/anseris%20cavus'

name 中有空格时(注意 name <regex("[\w ]+"):name> 设置中的空格)。

问题是:在这样的环境中我应该如何处理特殊字符——比如 ñ?谁应该处理 encoding/decoding:用户、界面 (Eve) 还是数据库 (MongoDB)?

好的,我知道了。当我通过浏览器测试应用程序时,我发现它一切正常。我会在这里保留这个问题并在此处添加答案,因为这可能对某些人有用;我学到了,希望其他人也能学到。

TL;DR: client 负责 encode 查询,并且然后解码结果(如有必要)。

在我使用 command-line 进行第一次测试后,我通过我的网络浏览器进行了测试,其中 url http://localhost:5000/centroid/mars/cañas 被 app/db 接受没有问题( Eve/MongoDB) 并返回答案:

<resource>
  <resource>
    <body>mars</body>
    <lat>-31.188</lat>
    <lon>89.86</lon>
    <name>cañas</name>
  </resource>
</resource>

太棒了。但现在我想知道如何从 terminal/bash.

中做到这一点

首先,我在谷歌上搜索了 "url encode",发现了一个可以使用的除虱小工具:https://meyerweb.com/eric/tools/dencoder/. Which encoded cañas for me (it uses Javascript encodeURIComponent()),现在我可以尝试使用 curl:

$ curl -s 'http://127.0.0.1:5000/centroid/mars/ca%C3%B1as%0A' | json_pp
{
   "_items" : [
      {
         "lat" : -31.188,
         "body" : "mars",
         "lon" : 89.86,
         "name" : "ca�as"
      }
   ]
}

很好。答案在ISO-8859.

然后 我想在我的终端中自己进行编码。 第二次搜索,现在搜索 "encode utf8 bash",将我带到这个 post:https://www.tecmint.com/convert-files-to-utf-8-encoding-in-linux/,在那里我了解了 iconv 工具。

使用 iconv 我有一个不同的编码字符串——我从 UTF-8ISO-8859-1——但一切正常:

$ echo 'http://127.0.0.1:5000/centroid/mars/cañas' | file -
/dev/stdin: UTF-8 Unicode text
$ URL=$(echo 'http://127.0.0.1:5000/centroid/mars/cañas' | iconv -f UTF-8 -t ISO-8859-1 -)
$ echo $URL
http://127.0.0.1:5000/centroid/mars/ca�as
$ echo $URL | file -
/dev/stdin: ISO-8859 text
$ curl -s $URL | json_pp
{
   "_items" : [
      {
         "lat" : -31.188,
         "lon" : 89.86,
         "body" : "mars",
         "name" : "ca�as"
      }
   ]
}