Является ли String.Replace(string,string) Unicode безопасным в отношении суррогатных пар?
Я пытаюсь найти лучший способ создать функцию, эквивалентную String.Replace("oldValue","newValue");
это может обращаться с суррогатными парами.
Меня беспокоит то, что если в строке есть суррогатные пары, и есть вероятность того, что строка соответствует части суррогатной пары, это может привести к разделению суррогата и повреждению данных.
Итак, мой вопрос высокого уровня: String.Replace(string oldValue, string newValue);
безопасная операция, когда дело доходит до Unicode и суррогатных пар?
Если нет, то какой будет лучший путь вперед? Я знаком с классом StringInfo, который может разбивать эти строки на элементы и тому подобное. Я просто не уверен, как выполнить замену при передаче строк для старых и новых значений.
Спасибо за помощь!
1 ответ
Это безопасно, потому что строки в.NET внутренне UTF-16. Кодовая точка Unicode может быть представлена одним или двумя кодовыми единицами UTF-16 и.NET char
это одна такая единица кода.
Когда кодовая точка представлена двумя единицами, первая единица называется высокой суррогатной, а вторая называется низкой суррогатной. Что важно в контексте этого вопроса, так это то, что суррогатные единицы относятся к определенному диапазону, U+D800 - U+DFFF. Этот диапазон используется только для представления суррогатных пар, одна единица в этом диапазоне не имеет значения и является недействительной.
По этой причине невозможно иметь допустимую строку utf-16, которая соответствует "части" суррогатной пары в другой допустимой строке utf-16.
Обратите внимание, что строка.NET может также представлять недопустимую строку utf-16. Если какой-либо аргумент Replace
является недействительным - тогда он действительно может разбить суррогатную пару. Но - мусор, мусор, поэтому я не считаю это проблемой в данном случае.