首页 > 解决方案 > 尝试将带有破折号的 JSON 字符串从 Tcl 传递到浏览器,但无法解析?

问题描述

由于缺乏几个领域的知识,过去两天我一直在做这个简单的任务。所以,这听起来像是重复昨天的问题,但事实并非如此。

我遇到了将纯文本字符串存储在 SQLite 中的问题,该字符串包含由三个字节表示的 em dash 226 128 148。我试图通过在文本编辑器中键入破折号来搜索字符串,但找不到它。

在 SO 的大量帮助下,我了解到纯文本可以轻松更改为 UTF-8;我这样做并更新了 SQLite 表列。如果运行,它现在显示为代码 8212 scan $c %c

现在,当从那里运行 SQLite 进行测试时,即使在命令行界面中也会显示破折号。

但是,由于以下错误,我无法再将记录发送到 Web 浏览器进行显示。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 请求是使用浏览器页面脚本中的 fetch 发出的return response.json(),我认为它失败了。

标签: sqlitetcl

解决方案


encoding convertfrom utf-8when storage (your decodeUTF) 需要与 on 检索匹配,然后通过您的仅二进制通道将其encoding convertto utf-8 $result返回给客户端:

puts $sock [encoding convertto utf-8 $result]

推荐阅读