试图从 Tcl 向浏览器传递带有 em 破折号的 JSON 字符串,但无法解析?
Trying to pass a JSON string with an em dash from Tcl to browser and it fails to parse?
由于在几个领域缺乏知识,过去两天我一直在绕圈子做这个简单的任务;所以,这听起来像是在重复昨天的问题,但事实并非如此。
我遇到了将纯文本字符串存储在 SQLite 中的问题,其中包含由三个字节 226 128 148
表示的长破折号。我试图通过在文本编辑器中键入破折号来搜索破折号的字符串,但找不到它。
在SO的帮助下,我了解到可以很容易地将纯文本更改为UTF-8;我这样做并更新了 SQLite table 列。如果 运行 scan $c %c
.
现在显示为代码 8212
现在,当 运行 SQLite 从那里进行测试时,即使在命令行界面中也会显示破折号。
但是,由于以下错误,我无法再将记录发送到网络浏览器进行显示。 SyntaxError: JSON.parse: bad control character in string literal at line 1 column 49 of the JSON data localhost:8000:233:25
当然,第 49 列是破折号。
如果我在将字符串从纯文本更新为 UTF-8 之前发回以前的版本,则浏览器中不会出现错误并且字符串会按预期显示。
很可能,这是一个非常愚蠢的问题,但我不知道我做错了什么或没有做。感谢您提供的任何指导。
我使用 SQLite 函数更新了一条记录。
dbt function decodeUTF -argcount 1 -deterministic -directonly -returntype text { encoding convertfrom utf-8 }
set sql {select decodeUTF(text_content) from tablename where conditions...}
dbt eval $sql
然后检索新值并将其发送到使用一些 Tcl 代码作为非常有限的本地服务器的浏览器。
proc GetSQL {sock} {
chan flush $sock
set sql {select text_content from tablename where conditions ... }
dbt eval $sql {
set result "{\"result\":\"$text_content\"}"
}
set headers ""
append headers "HTTP/1.1 200 OK\n"
append headers "Content-Type: application/json; charset: utf-8\n"
append headers "Content-Length: [string length $result]\n"
append headers "Connection: Keep-Alive\n"
puts $sock $headers
chan configure $sock -translation binary
puts $sock $result
}
GET 请求是使用从浏览器页面脚本获取的,return response.json()
是我认为它失败的地方。
存储时的 encoding convertfrom utf-8
(您的 decodeUTF
)需要在检索时与 encoding convertto utf-8 $result
匹配,然后通过您的二进制通道将其返回给客户端:
puts $sock [encoding convertto utf-8 $result]
由于在几个领域缺乏知识,过去两天我一直在绕圈子做这个简单的任务;所以,这听起来像是在重复昨天的问题,但事实并非如此。
我遇到了将纯文本字符串存储在 SQLite 中的问题,其中包含由三个字节 226 128 148
表示的长破折号。我试图通过在文本编辑器中键入破折号来搜索破折号的字符串,但找不到它。
在SO的帮助下,我了解到可以很容易地将纯文本更改为UTF-8;我这样做并更新了 SQLite table 列。如果 运行 scan $c %c
.
现在,当 运行 SQLite 从那里进行测试时,即使在命令行界面中也会显示破折号。
但是,由于以下错误,我无法再将记录发送到网络浏览器进行显示。 SyntaxError: JSON.parse: bad control character in string literal at line 1 column 49 of the JSON data localhost:8000:233:25
当然,第 49 列是破折号。
如果我在将字符串从纯文本更新为 UTF-8 之前发回以前的版本,则浏览器中不会出现错误并且字符串会按预期显示。
很可能,这是一个非常愚蠢的问题,但我不知道我做错了什么或没有做。感谢您提供的任何指导。
我使用 SQLite 函数更新了一条记录。
dbt function decodeUTF -argcount 1 -deterministic -directonly -returntype text { encoding convertfrom utf-8 }
set sql {select decodeUTF(text_content) from tablename where conditions...}
dbt eval $sql
然后检索新值并将其发送到使用一些 Tcl 代码作为非常有限的本地服务器的浏览器。
proc GetSQL {sock} {
chan flush $sock
set sql {select text_content from tablename where conditions ... }
dbt eval $sql {
set result "{\"result\":\"$text_content\"}"
}
set headers ""
append headers "HTTP/1.1 200 OK\n"
append headers "Content-Type: application/json; charset: utf-8\n"
append headers "Content-Length: [string length $result]\n"
append headers "Connection: Keep-Alive\n"
puts $sock $headers
chan configure $sock -translation binary
puts $sock $result
}
GET 请求是使用从浏览器页面脚本获取的,return response.json()
是我认为它失败的地方。
存储时的 encoding convertfrom utf-8
(您的 decodeUTF
)需要在检索时与 encoding convertto utf-8 $result
匹配,然后通过您的二进制通道将其返回给客户端:
puts $sock [encoding convertto utf-8 $result]