Flutter解析unicode字符不工作

oyxsuwqo  于 2023-01-21  发布在  Flutter
关注(0)|答案(3)|浏览(328)

我有以下字符串来自我的后端服务器\u25CF\u25CF\u25CF,当我用UTF-8解码它时,它在iOS原生应用程序中运行良好,但当我尝试在flutter中解析它时,我无法获得转换后的值。我尝试了以下方法,但没有成功

String converted = Utf8Decoder().convert(userName.codeUnits);
String uname = utf8.decode(userName.runes.toList());
String runes = String.fromCharCodes(Runes('$userName'));

有谁知道我们如何解决这个问题吗?转换后的真实值应该是3个点。

    • 更新**

这是json解析代码

if (response.statusCode == 200) {
        Map<String, dynamic> postResponse = response.data;
        var postsJson = postResponse["posts"];
     
        for (var postObjet in postsJson) {
          Map<String, dynamic> finalMap = Map<String, dynamic>.from(postObjet);
          Post p = Post.fromMap(finalMap);
          posts.add(p);
          
        }
}

JSON响应示例

The Chat service we\u2019ve been paying for since our launch
yshpjwxd

yshpjwxd1#

您从一个带有unicode转义的字符串开始,然后希望以一个包含实际unicode字符的字符串结束,如果输入只包含unicode转义,这很容易,因为您可以简单地去掉\u并将十六进制解析为一个码位。

final input = '\\u25CF\\u25CF\\u25CF'; // note I have to double the \ as this is source code
  var hexPoints = input.split('\\u').sublist(1);
  print(hexPoints); // [25CF, 25CF, 25CF]

  // convert to a string from codepoints, parsing each hex string to an int
  final result = String.fromCharCodes(
    hexPoints.map<int>((e) => int.parse(e, radix: 16)).toList(),
  );
  print(result); // dot, dot, dot

对于可能同时存在转义字符和未转义字符的情况,更通用的解决方案是使用匹配\xnnnn的正则表达式,将nnnn解析为十六进制,然后用该码位替换它。

String sanitize(String s) => s.replaceAllMapped(
      RegExp(r'\\u([0-9a-fA-F]{4})'),
      (Match m) => String.fromCharCode(int.parse(m.group(1)!, radix: 16)),
    );

像这样使用它:

print(sanitize('ab\\u25CF\\u25CF\\u25CFcd')); //ab<dot><dot><dot>cd

最后,请注意,如果这些转义字符串出现在JSON中,JSON解码器将自动转换它们。

ryevplcw

ryevplcw2#

试试这个

const utf8Decoder = Utf8Decoder(allowMalformed: true);
      final decodedBytes = utf8Decoder.convert(response.bodyBytes);
a0x5cqrl

a0x5cqrl3#

考虑使用characters包而不是符文。看起来它可以解决你的问题。

相关问题