关于代理对,String.Replace(string,string) Unicode 安全吗?
Is String.Replace(string,string) Unicode Safe in regards to Surrogate Pairs?
我正在尝试找出创建等同于 String.Replace("oldValue","newValue");
的函数的最佳方法
可以处理代理对。
我担心的是,如果字符串中有代理项对,并且某个字符串可能与部分代理项对匹配,它可能会拆分代理项并导致数据损坏。
所以我的高级问题是:在涉及 Unicode 和代理对时,String.Replace(string oldValue, string newValue);
是一个安全的操作吗?
如果没有,最好的前进道路是什么?我熟悉可以将这些字符串拆分为元素等的 StringInfo class。我只是不确定在为旧值和新值传递字符串时如何进行替换。
感谢您的帮助!
这是安全的,因为 .NET 中的字符串在内部是 UTF-16。 Unicode代码点可以用一个或两个UTF-16代码单元表示,.NETchar
就是一个这样的代码单元。
当代码点由两个单元表示时,第一个单元称为高代理项,第二个称为低代理项。在这个问题的上下文中重要的是代理单位属于特定范围,U+D800 - U+DFFF。此范围仅用表示代理对,此范围内的单个单位无任何意义,无效。
因此,不可能有有效的 utf-16 字符串与另一个有效的 utf-16 字符串中的代理对 "part" 相匹配。
请注意,.NET 字符串也可以表示无效的 utf-16 字符串。如果 Replace
的任何参数无效 - 那么它确实可以拆分代理对。但是 - 垃圾进,垃圾出,所以我不认为这在给定情况下是个问题。
我正在尝试找出创建等同于 String.Replace("oldValue","newValue");
的函数的最佳方法
可以处理代理对。
我担心的是,如果字符串中有代理项对,并且某个字符串可能与部分代理项对匹配,它可能会拆分代理项并导致数据损坏。
所以我的高级问题是:在涉及 Unicode 和代理对时,String.Replace(string oldValue, string newValue);
是一个安全的操作吗?
如果没有,最好的前进道路是什么?我熟悉可以将这些字符串拆分为元素等的 StringInfo class。我只是不确定在为旧值和新值传递字符串时如何进行替换。
感谢您的帮助!
这是安全的,因为 .NET 中的字符串在内部是 UTF-16。 Unicode代码点可以用一个或两个UTF-16代码单元表示,.NETchar
就是一个这样的代码单元。
当代码点由两个单元表示时,第一个单元称为高代理项,第二个称为低代理项。在这个问题的上下文中重要的是代理单位属于特定范围,U+D800 - U+DFFF。此范围仅用表示代理对,此范围内的单个单位无任何意义,无效。
因此,不可能有有效的 utf-16 字符串与另一个有效的 utf-16 字符串中的代理对 "part" 相匹配。
请注意,.NET 字符串也可以表示无效的 utf-16 字符串。如果 Replace
的任何参数无效 - 那么它确实可以拆分代理对。但是 - 垃圾进,垃圾出,所以我不认为这在给定情况下是个问题。