将字符串(带有 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)。你在开头看到多少个5cs——反斜杠的十六进制值? 【参考方案1】:

你的问题是你在双重编码。

您正在获取一个字符串,将其转换为 ASCII,然后将其重新解析为 UTF8,然后将 that(可能)编码为 JSON,即 UTF8。在此过程中,您的第二个编码器正在转义反斜杠。

解决此问题的最佳方法是重新设计您的服务器以接受 UTF8。但是,如果你不能这样做,你需要确保你只对这个字符串编码一次,用 ASCII 码。

简而言之,您应该摆脱 emojiToUTF8 并确保您的 parameters 处理器按照服务器所需的方式进行编码(显然是 ASCII 而不是 UTF8)。

【讨论】:

以上是关于将字符串(带有 unicode 字符)添加到字典时添加额外的斜杠( \ )的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Unicode 支持添加到 CRichEditCtrl?

将 unicode 添加到字符串 html 标记模式

将字典的键和值从“unicode”转换为“str”的最快方法?

javascript转到带有unicode字符的url

将带有 NSAttributed 字符串的字典保存到 PList 或 NSUserDefaults

如何以编程方式将字符串和键添加到 iPhone 中的字典?