当前位置: 首页 > 编程语言 > C#

将两个ascii字符转换为它们“对应”的单字符扩展ascii表示分享

时间:2023-04-10 18:26:42 C#

将两个ascii字符转换为它们“对应”的单字符扩展ascii表示问题:我有两个来自外部系统的定宽细绳。第一个包含基本字符(如a-z),第二个(MAY)包含要附加到第一个字符串以创建实际字符的变音符号。stringasciibase="Dutch有有趣的字符:a,e,u";字符串变音符号="'""";//不知道该怎么做stringresult="Dutchhasfunnychars:á,?,ü";我可以编写大量搜索并替换所有字符+不同的变音符号,但希望有更优雅的东西。有谁知道如何解决这一问题?尝试使用string.Normalize(c#)计算十进制值,但没有结果。谷歌也没有真正弄明白。除了使用查找表之外,我找不到简单的解决方案:publicvoidTestMethod1(){stringasciibase="Dutchhasfunnychars:a,e,u";字符串变音符号="'""";varmerged=DiacritMerger.Merge(asciibase,变音符号);}[编辑:@JonB和@Oliver的回答中的建议后的简化代码]staticstringMerge(stringasciiBase,stringdiacrits){varcombined=asciiBase.Zip(diacrits,(ascii,diacrit)=>DiacritVersion(diacrit,ascii));返回新字符串(combined.ToArray());}privatestaticcharDiacritVersion(chardiacrit,charcharacter){charcombine;return_lookup.TryGetValue(diacrit,outcombine)?newstring(new[]{character,combine}).Normalize()[0]:character;}}将变音符号转换为Unicode组合变音符号范围的合适的unicode值:http://www.unicode.org/charts/PDF/U0300.pdf然后slapschar和它的变量声学符号,比如e-acute,U+0065="e",U+0301=急性。字符串s="u0065u0301";然后:stringnormalizedString=s.Normalize();将两者组合成一个新的字符串。问题是必须显式解析指定的变音符号,导致双点不出现在鞋底上,因此在这种情况下使用双引号。所以你没有任何其他机会来实施每一个必要的案例来解决你的问题。这是线索的起点...publicSomeFunction(){stringasciiChars="Dutchhasfunnychars:a,e,u";字符串变音符号="'""";varcombinedChars=asciiChars.Zip(diacrits,(ascii,diacrit)=>{returnCombineChars(ascii,diacrit);});varResult=newString(combinedChars.ToArray());}privatecharCombineChars(charascii,chardiacrit){switch(diacrit){case'"':returnAddDoublePoints(ascii);case''':returnAddAccent(ascii);default:returnascii;}}privatecharAddDoublePoints(charascii){switch(ascii){case'a':return'?';case'o':return'?';case'u':return'ü';default:returnascii;}}privatecharAddAccent(charascii){switch(ascii){case'a':return'á';case'o':return'ó';default:returnascii;}}}IEnumerable.Zip已经在.Net4中实现,但是要在3.5中得到它你需要这段代码(取自EricLippert):if(first==null)thrownewArgumentNullException("first");if(second==null)thrownewArgumentNullException("second");如果(resultSelector==null)抛出新的ArgumentNullException(“resultSelector”);返回ZipIterator(第一,第二,结果选择器);}privatestaticIEnumerableZipIterator(IEnumerablefirst,IEnumerablesecond,FuncresultSelector){使用(IEnumeratore1=first.GetEnumerator())使用(IEnumeratore2=second.GetEnumerator())while(e1.MoveNext()&&e2.MoveNext())yieldreturnresultSelector(e1.Current,e2.Current);我不知道C#或其标准库,但另一种方法可能是利用现有的HTML/SGML/类似XML字符实体解析器/渲染器的东西,或者如果你真的要将它渲染到浏览器,则什么都不用!伪代码:for(i=0;i因此,A+o->?,u+"->ü等等如果你能解析html实体,你应该在家自由,甚至可以在charsets之间移植!以上是C#学习教程:将两个ascii字符转换成它们“对应”的一个字符扩展ascii表示法分享所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多加关注————本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,转载请注明出处: