将字符串(带有 unicode 字符)添加到字典时添加额外的斜杠( \ )
Posted
技术标签:
【中文标题】将字符串(带有 unicode 字符)添加到字典时添加额外的斜杠( \\ )【英文标题】:Extra slash ( \ ) getting added when string (with unicode character) added to a dictionary将字符串(带有 unicode 字符)添加到字典时添加额外的斜杠( \ ) 【发布时间】:2020-11-17 14:27:54 【问题描述】:我面临以下问题:
在我的应用中,用户也可以在文本字段中输入特殊字符(如表情符号)。因此,在将输入的文本发送到请求正文中的服务器时,我正在使用以下代码对其进行转换:
func emojiToUTF8()->String
let data = self.data(using: .nonLossyASCII, allowLossyConversion: true)
let emoji = String.init(data: data!, encoding: .utf8)
return emoji ?? self
例如,如果我输入文本"☺️"
,它会使用上述方法转换为"\u263a\ufe0f"
。到这里为止一切都很好。
当我将它添加到字典中以将其作为请求参数发送到服务器时,就会出现问题。我正在使用的代码:
var parameters = [String:String]()
parameters["feedback"] = feedBackTxt
print("Parameters:",parameters) /// output: ["feedback": "\\u263a\\ufe0f"]
因此,这里的问题是由于字符转义,在每个斜杠之前都会附加一个额外的斜杠。我也检查了创建的字典值。它也在那里显示双斜线。我该如何避免这种情况?当我只是用字符串创建字典时,为什么会发生这种情况?这导致服务器端出现问题。
我尝试了几件事,但似乎都没有工作。
【问题讨论】:
这不是错误,而是一项功能。第二个反斜杠是虚拟的,需要在字符串文字中转义单个反斜杠。 这只是print
工作原理的产物。
我们也在服务器端进行了调试。他们收到的请求有双斜线。
在服务器上调试怎么样?这是 one 反斜杠的证据:print(Data("\\u263a\\ufe0f".utf8) as NSData)
。你在开头看到多少个5c
s——反斜杠的十六进制值?
【参考方案1】:
你的问题是你在双重编码。
您正在获取一个字符串,将其转换为 ASCII,然后将其重新解析为 UTF8,然后将 that(可能)编码为 JSON,即 UTF8。在此过程中,您的第二个编码器正在转义反斜杠。
解决此问题的最佳方法是重新设计您的服务器以接受 UTF8。但是,如果你不能这样做,你需要确保你只对这个字符串编码一次,用 ASCII 码。
简而言之,您应该摆脱 emojiToUTF8
并确保您的 parameters
处理器按照服务器所需的方式进行编码(显然是 ASCII 而不是 UTF8)。
【讨论】:
以上是关于将字符串(带有 unicode 字符)添加到字典时添加额外的斜杠( \ )的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Unicode 支持添加到 CRichEditCtrl?
将字典的键和值从“unicode”转换为“str”的最快方法?