Saya perlu membersihkan string yang memiliki karakter pelarian tetapi tidak bisa melakukannya.

Ini kode pengujian saya:

test('Replace unicode escape character', () {
    String originalText = 'Jeremiah  52:1\\u201334';
    String replacedText = originalText.replaceAll(r'\\', r'\');
    expect(replacedText, 'Jeremiah  52:1\u201334');
  });

Gagal dengan kesalahan:

Expected: 'Jeremiah  52:1–34'
  Actual: 'Jeremiah  52:1\\u201334'
   Which: is different.
          Expected: ... miah  52:1–34
            Actual: ... miah  52:1\\u201334
1
Paurakh Sharma Humagain 5 November 2020, 14:46

1 menjawab

Jawaban Terbaik

Karakter unicode dan karakter escape tidak disimpan seperti Anda menulisnya saat Anda menulis string -- mereka dikonversi ke nilainya sendiri. Ini terbukti ketika Anda menjalankan kode berikut:

print('\\u2013'.length); // Prints: 6
print('\u2013'.length);  // Prints: 1

Di sini, yang terjadi adalah: yang pertama menyimpan karakter berikut: '\', 'u', '2', '0', '1', dan '3' -- sedangkan yang terakhir hanya menyimpan '–'.

Oleh karena itu, upaya Anda untuk mengubah yang pertama dengan mengganti dua garis miring \\ dengan satu garis miring \ tidak akan berhasil, karena kompilator tidak lagi mengonversi karakter escape unicode Anda.

Itu tidak berarti bahwa Anda tidak akan dapat mengubah kode unicode Anda menjadi karakter unicode. Anda dapat menggunakan kode berikut:

final String str = 'Jeremiah  52:1\\u2013340';
final Pattern unicodePattern = new RegExp(r'\\u([0-9A-Fa-f]{4})');
final String newStr = str.replaceAllMapped(unicodePattern, (Match unicodeMatch) {
  final int hexCode = int.parse(unicodeMatch.group(1), radix: 16);
  final unicode = String.fromCharCode(hexCode);
  return unicode;
});
print('Old string: $str');
print('New string: $newStr');
2
KapilDev Neupane 5 November 2020, 15:40