postgres + node + angular:utf-8的问题和带有中文字符的查询

时间:2014-12-12 12:54:07

标签: angularjs node.js encoding utf-8

在一个小样本应用程序中,我试图处理非拉丁字符。所以我有一个PostgreSQL DB 9.4,一个NodeJS服务器,并为客户端使用Angular。在Postgres,我有一个简单的表' name'收集了英文,俄文和中文名称(拉丁文/西里尔文/中文utf-8字符)。

问题是,如果我从浏览器发送REST请求(在SELECT-WHERE-LIKE查询中使用Postgres),我得到的是英语术语的正确查询响应,但不是中文术语。使用REST字符串中的非拉丁字符,我总是什么也得不到。

  • Postgres设置为UTF-8(char类型' C')
  • 在pgAdmin中完成的查询与拉丁文/西里尔文/中文字符配合良好

  • 节点I中的
  • 为Postgres设置:client.client_encoding =' UTF8';

  • 以及HTTP响应:res.writeHead(200,{' content-type':' application / json',' charset': ' UTF-8','内容长度':Buffer.byteLength(JSON)});

  • 浏览器告诉我我的HTML / Angular页面:编码UTF-8

我发现,Node收到类似' / dataload / name?%E9%82%A3%E4%BD%95'而不是' / dataload / name?那何'。当然,如果我在LIKE查询中使用它,那么LIKE %% E9%82%A3%E4%BD%95%并且明显不起作用。但是我忘记了什么?我需要做些什么来让Node收到正确的UTF-8字符?顺便说一句,我使用Webstorm / Windows进行开发。我应该提供更多信息吗?我猜Postgres设置正常,但是在浏览器或Angular代码中有一些设置...? 提前感谢任何暗示!

更新

我刚在Angular请求中添加了头配置:

$http.get(strReq, {
        headers: { 'Content-Type': 'application/json; charset=utf-8' }
    })

但问题仍然存在。 Firebug告诉我:

GET http://.../dataload/name?%E9%82%A3%E4%BD%95

使用此请求标头:     接受application / json,text / plain, /     Accept-Encoding gzip,deflate     Accept-Language en-US,en; q = 0.5     DNT 1     主持localhost
    User-Agent Mozilla / 5.0(Windows NT 6.3; WOW64; rv:34.0)Gecko / 20100101 Firefox / 34.0

但作为参数正确:那何

1 个答案:

答案 0 :(得分:0)

有几件事。

  1. RFC3986定义了网址中可以包含的字符,它基本上是一个简短的列表。任何不适合该列表的内容都必须表示为url编码字符(%E9等)。所以你在服务器上收到的内容看起来就像是为网址编码了一样。
  2. 如果你进行POST,那么mime类型的自由度就会如何传递。
  3. 声明的页面编码(在charset标头或元html标头中)通常决定了浏览器打包输入的方式 - 甚至超过了它读取html的方式。声明了utf8之后,你的中文字符实际上会被序列化(除了%xx将由实际的相应字节值表示)。您的浏览器只知道如何将其显示为2个汉字。你可能已经宣布了utf16,但是上次我测试的时候浏览器对于他们如何处理它们有点不知所措。
  4. 结果是您需要首先在服务器端进行URL解码,或者使用已经为您完成此操作的框架。