Является ли String.Replace (string, string) Unicode безопасным в отношении суррогатных пар? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь найти лучший способ создать функцию, эквивалентную String.Replace("oldValue","newValue"); которые могут обрабатывать суррогатные пары.

Меня беспокоит то, что если в строке есть суррогатные пары и существует вероятность того, что строка соответствует части суррогатной пары, то это потенциально может разделить суррогат и привести к повреждению данных.

Итак, мой вопрос высокого уровня: Является ли String.Replace(string oldValue, string newValue); безопасной операцией, когда речь идет о Unicode и суррогатных парах?

Если нет, то какой будет лучший путь вперед? Я знаком с классом StringInfo, который может разбивать эти строки на элементы и тому подобное. Я просто не уверен, как выполнить замену при передаче строк для старых и новых значений.

Спасибо за помощь!

1 Ответ

0 голосов
/ 04 мая 2018

Это безопасно, потому что строки в .NET внутренне UTF-16. Кодовая точка Unicode может быть представлена ​​одной или двумя кодовыми единицами UTF-16, и .NET char является одной такой кодовой единицей.

Когда кодовая точка представлена ​​двумя единицами, первая единица называется старшей суррогатной, а вторая называется малой суррогатной. Что важно в контексте этого вопроса, так это то, что суррогатные единицы относятся к определенному диапазону, U + D800 - U + DFFF. Этот диапазон используется только для представления суррогатных пар, одна единица в этом диапазоне не имеет значения и является недействительной.

По этой причине невозможно иметь допустимую строку utf-16, которая соответствует "части" суррогатной пары в другой допустимой строке utf-16.

Обратите внимание, что строка .NET может также представлять недопустимую строку utf-16. Если какой-либо аргумент Replace недопустим - тогда он действительно может разбить суррогатную пару. Но - мусор, мусор, поэтому я не считаю это проблемой в данном случае.

...