如何将Unicode字符串转换为另一种类型的Unicode字符串

时间:2017-03-24 01:46:29

标签: c# regex unicode pattern-matching

当涉及到字符串中特定类型的Unicode字符串时,我想用不同的类型替换Unicode字符串。

EX)1。

//Hexadecimal 4characters
string base="U+1234FFFF040001041234";
//I want to replace this type----> ሴЀĄሴ

EX)2。

//Hexadecimal 4characters
string base="U+1234 U+FFFF U+0400 U+0104 U+1234";
//----> ሴ  Ѐ Ą ሴ

我想知道如何使用正则表达式进行模式匹配。 我想知道如何以这种方式取代它。

2 个答案:

答案 0 :(得分:0)

我不熟悉C#(我主要使用Java),但这里是我将要做的抽象描述:

EX)1。   - 将字符串转换为字符数组

  • 创建一个空字符串(String s =“”)

  • 创建一个添加前缀的循环,加上接下来的四个字符(循环中:s = s +“& #x”+ charArray [k] + charArray [k + 1] + charArray [k + 2] + charArray [k + 3])

  • 在末尾添加分号

EX)2。

  • 您想要匹配的模式将被替换为:“U \ +”,您将用“;& #x”替换它。但是你必须事先取下第一个U +。

你必须在加号之前添加反斜杠的原因是因为这是重复运算符,反斜杠将使其转义。我不知道C#,但是在Java中,你必须在字符串中逃避转义,所以你实际上会使用“U \\ +”

答案 1 :(得分:0)

Regex regexUnicode = new Regex(@"U\+([0-9A-F]{4})+");

        MatchCollection resultCollection = regexUnicode.Matches(str);
        foreach (Match matched in resultCollection) {

            int length = matched.Groups[0].Length;                      
            string matchedStr = matched.Groups[0].ToString();           
            int startIndex = str.IndexOf(matchedStr);                   
            string temp = matchedStr;
            string ret = "";
            string buffer = "";
            int bufCount = 0;
            for (int i = 0; i < matchedStr.Length; ++i) {
                if (matchedStr[i] == 'U' || matchedStr[i] == '+') {
                    continue;
                } else if (bufCount != 4) {                         
                    buffer += matchedStr[i];
                    bufCount++;
                } else if (bufCount == 4) {                          
                    ret += "&#x" + buffer + ";";
                    buffer = "";
                    buffer += matchedStr[i];
                    bufCount = 1;
                }
            }
            ret += "&#x" + buffer + ";";
            str = str.Remove(startIndex, matchedStr.Length);       
            str = str.Insert(startIndex, ret);                     
        }