NodeMCU http.get()和UTF-8字符集

时间:2016-03-16 15:46:22

标签: http utf-8 character-encoding nodemcu

我正在使用NodeMCU dev分支的http模块向Google Calendar API发出GET请求。但是,当我检索事件并解析答案时,由于编码不正确,我会得到奇怪的字符。

我尝试在请求的标头中添加Accept-Charset: utf-8,但请求失败(代码= -1)。

有没有办法设置charset,或者之后在lua中转换它?

function bdayshttps(curr_date)
    if (string.len(curr_date) == 10) then
        http.get("https://www.googleapis.com/calendar/v3/calendars/"..
                    "<CalendarID>/events"..
                    "?timeMax="..curr_date.."T23%3A59%3A59-00%3A00"..
                    "&timeMin="..curr_date.."T00%3A00%3A00-00%3A00&fields=items%2Fsummary"..
                    "&key=<Google Calendar API key>", "Accept-Charset: utf-8", function(code, data)
            if (code < 0) then
              print("msg:birthdays error")
            else
              if (code == 200) then
                output = ""
                for line in data:gmatch"\"summary\": \"[^\n]*" do
                    output = output..line:sub(13, line:len()-1)..";"
                end
                print("bday:"..output)
              end
            end
        end)
    end
end

出于显而易见的原因,我删除了calendarID和API密钥。

编辑:

此代码的结果返回msg:birthday error,表示GET请求返回code=-1

在标题中替换"Accept-Charset: utf-8" nil时,我得到:

Loïc Simonetti代替Loïc Simonetti

2 个答案:

答案 0 :(得分:3)

API docs表示您需要将\r\n附加到您设置的每个标头中。 http.post()的文档中有一个示例。

因此,您应该设置"Accept-Charset: utf-8"而不是"Accept-Charset: utf-8\r\n"

答案 1 :(得分:1)

对于问题的第二部分(现在响应正常),您似乎收到了有效的UTF8 Unicode。

Loïc对应于以下UTF8 code units4C 6F C3 AF 63

Loïc以通用编码(CodePage 1252)具有以下字节值:4C 6F C3 AF 63

所以我的猜测是你用来查看字节的终端或其他设备是错误的,而不是你的请求/响应不正确。根据Per @ Marcel的链接,Lua根本不处理Unicode,所以这是你可以做的最好的事情(安全地接收,存储,然后再发回)