C# 字符串與unicode互相轉(zhuǎn)換實(shí)戰(zhàn)案例
我就廢話不多說(shuō)了,大家還是直接看代碼吧~
/// <summary> /// 字符串轉(zhuǎn)Unicode /// </summary> /// <param name="source">源字符串</param> /// <returns>Unicode編碼后的字符串</returns> public static string String2Unicode(string source) { var bytes = Encoding.Unicode.GetBytes(source); var stringBuilder = new StringBuilder(); for (var i = 0; i < bytes.Length; i += 2) { stringBuilder.AppendFormat("\\u{0:x2}{1:x2}", bytes[i + 1], bytes[i]); } return stringBuilder.ToString(); } /// <summary> /// 字符串轉(zhuǎn)為UniCode碼字符串 /// </summary> /// <param name="s"></param> /// <returns></returns> public static string StringToUnicode(string s) { char[] charbuffers = s.ToCharArray(); byte[] buffer; StringBuilder sb = new StringBuilder(); for (int i = 0; i < charbuffers.Length; i++) { buffer = System.Text.Encoding.Unicode.GetBytes(charbuffers[i].ToString()); sb.Append(String.Format("\\u{0:X2}{1:X2}", buffer[1], buffer[0])); } return sb.ToString(); } /// <summary> /// Unicode字符串轉(zhuǎn)為正常字符串 /// </summary> /// <param name="srcText"></param> /// <returns></returns> public static string UnicodeToString(string srcText) { string dst = ""; string src = srcText; int len = srcText.Length / 6; for (int i = 0; i <= len - 1; i++) { string str = ""; str = src.Substring(0, 6).Substring(2); src = src.Substring(6); byte[] bytes = new byte[2]; bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2), System.Globalization.NumberStyles.HexNumber).ToString()); bytes[0] = byte.Parse(int.Parse(str.Substring(2, 2), System.Globalization.NumberStyles.HexNumber).ToString()); dst += Encoding.Unicode.GetString(bytes); } return dst; }
補(bǔ)充:C# unicode string 轉(zhuǎn)換 codepoint
C# 的string和StringBuilder都支持使用codepoint直接構(gòu)造字符串。unicode的字符串形式一般都是'\u1234'這種轉(zhuǎn)義模式。 其中‘1234'就是unicode codepoint的16進(jìn)制形式。
通過(guò)計(jì)算,可以把這種形式的字符串,直接轉(zhuǎn)化為int32類型的codepoint。
/// <summary> /// Get the unicode code point /// </summary> private static int GetUnicodeCodePoint(char c1, char c2, char c3, char c4) { return UnicodeCharToInt(c1) * 0x1000 + UnicodeCharToInt(c2) * 0x100 + UnicodeCharToInt(c3) * 0x10 + UnicodeCharToInt(c4); } /// <summary> /// Single unicode char convert to int /// </summary> private static int UnicodeCharToInt(char c) { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return c - '0'; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': return c - 'a' + 10; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': return c - 'A' + 10; } throw new Exception(string.Format("Unicode char '{0}' error", c)); }
使用的時(shí)候codepoint需要強(qiáng)轉(zhuǎn)為char類型。比如:
StringBuilder sb = new StringBuilder(); sb.Append((char) GetUnicodeCodePoint(c1, c2, c3, c4));
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#實(shí)現(xiàn)窗體淡入淡出效果的方法總結(jié)
C#實(shí)現(xiàn)窗體淡入淡出效果的方法總結(jié),需要的朋友可以參考一下2013-05-05分享我在工作中遇到的多線程下導(dǎo)致RCW無(wú)法釋放的問(wèn)題
最近在做項(xiàng)目中遇到一個(gè)問(wèn)題,在調(diào)用一個(gè)類庫(kù)中的方法時(shí),出現(xiàn)如下異常信息:嘗試釋放正在使用的RCW,活動(dòng)線程或其他線程上正在使用該 RCW,釋放正在使用的 RCW 的嘗試會(huì)導(dǎo)致?lián)p壞或數(shù)據(jù)丟失2015-12-12C#通過(guò)Semaphore類控制線程隊(duì)列的方法
這篇文章主要介紹了C#通過(guò)Semaphore類控制線程隊(duì)列的方法,涉及Semaphore類操作線程隊(duì)列的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C#實(shí)現(xiàn)讀取多條數(shù)據(jù)記錄并導(dǎo)出到Word
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)讀取多條數(shù)據(jù)記錄并導(dǎo)出到Word,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03關(guān)于async和await的一些誤區(qū)實(shí)例詳解
這篇文章主要介紹了關(guān)于async和await的一些誤區(qū)實(shí)例詳解,有助于更加深入的理解C#程序設(shè)計(jì),需要的朋友可以參考下2014-08-08