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 将收到对其 body
和 name
字段的查询。
您可能已经注意到空格和特殊字符 ("ñ
") 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-8
到 ISO-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"
}
]
}
我有一个 (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 将收到对其 body
和 name
字段的查询。
您可能已经注意到空格和特殊字符 ("ñ
") 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-8
到 ISO-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"
}
]
}