说到这个话题,我似乎特别头脑糊涂。我有 utf-8 文本(来自浏览器的 JSON 字符串),其中包含破折号和大撇号;我想将其存储在 SQLite 数据库中,以便可以搜索包括特殊字符;当然,还将其发送回浏览器。
我遇到了特殊字符显示不正确的问题,当我做了一些事情导致它们正确显示时,长度会关闭,这样用户界面中所做的更改就会发生在文本中的不同位置数据。
我认为部分问题是我不明白使用 XOR 解码后立即得到的内容。它只是一组整数,需要使用
binary format ...
转换回二进制字符串,然后,如果数据要在数据库中正确显示,则需要将其读取为操作码 1 的文本?
解码后使用
encoding convertfrom utf-8 ...
和从数据库提取后并通过套接字发送之前使用 encoding convertto utf-8 ...
是正确的方法吗?
我以为浏览器一开始就发送 utf-8 JSON;所以,与 utf-8 之间的转换似乎是错误的;但这是我能够让数据库正确存储字符并能够将它们发送回浏览器而不会出现 JSON 解析错误或字符串长度存在差异的唯一方法。
感谢您提供的任何指导。
我正在将
decoded
存储在数据库中。
set raw_decoded {}
foreach b $enc {
append raw_decoded \
"[expr {$b ^ [lindex $mKey [expr {[incr offset] % 4}]]}] "
}
if { $op == 1 } {
append decoded [encoding convertfrom utf-8\
[binary format cu* $raw_decoded]]
}
并提取与
response
相同的数据以发送到浏览器。并且 $sock
配置为二进制。
set response [encoding convertto utf-8 $response]
set len [string length $response]
if { $len > 65535 } {
chan puts -nonewline $sock [binary format cu2Wu {129 127} $len]
} elseif { $len > 125 } {
chan puts -nonewline $sock [binary format cu2Su {129 126} $len]
} elseif { $len > 0 } {
chan puts -nonewline $sock [binary format cu2 [list 129 $len]]
}
chan puts -nonewline $sock $response
chan flush $sock
}
浏览器中的 JSON 字符串在概念上是一个 unicode 字符序列,需要以某种方式编码为一系列字节,以便通过 websocket 从浏览器传输到后端(我猜这是基于你的异或解密步骤)。然后,该编码字符串(可能是 UTF-8)被屏蔽并作为字节序列发送。 XOR 取消屏蔽的是字节序列,XOR 取消屏蔽这些字节以恢复 JSON 字符串编码到的字节序列。然后需要解释字符串的编码(在本例中为 UTF-8)以将其转回字符序列。
也就是说 - 浏览器会执行此操作(假设
json
包含浏览器中的 JSON 字符串):
message = xor_mask(utf8_encode(json))
然后通过线路将
message
的字节发送给您,因此您需要反转转换,如下所示:
json = utf8_decode(xor_mask(json))