试图从 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]