将String转换为Unicode

时间:2015-08-07 03:35:38

标签: java arrays unicode

我有一个字符串" text"在一个类中调用另一个类中的方法以各种方式转换文本。在这个方法中虽然我留下了" ArrayIndexOutOfBoundsException"错误。

public String toUnicode() {
    char unicodeTextArray[] = new char[text.length()];

    if (text == null || text.isEmpty()) {
        return "";
    }

    String unicodeTextArrayString[] = new String[text.length()];

    for (int i = 0; i < text.length(); i++) {

        unicodeTextArray[i] = text.charAt(i);

        if (unicodeTextArray[i] < 0x10) {
            unicodeTextArrayString[i] = "\\u000" + Integer.toHexString(unicodeTextArray[i]);
        } else if (unicodeTextArray[i] < 0x100) {
            unicodeTextArrayString[i] = "\\u00" + Integer.toHexString(unicodeTextArray[i]);
        } else if (unicodeTextArray[i] < 0x1000) {
            unicodeTextArrayString[i] = "\\u0" + Integer.toHexString(unicodeTextArray[i]);
        }
        unicodeTextArrayString[i] = "\\u" + Integer.toHexString(unicodeTextArray[i]);
    }

    String unicode = unicodeTextArrayString[text.length()];
    return unicode;
}

将一行更改为任意大的数字,例如:

String unicodeTextArrayString[] = new String[9999];

没有错误,但返回null。

我考虑过设置一个int变量来增加数组的长度,但* 4仍然太小了数组大小,看起来如果我变得太大它只返回null。

我怎样才能获得正确长度的数组?

编辑:我发现一个非数组方法可行,但我仍然想知道是否有办法让上述数组方法以某种方式工作。

public String toUnicode() 
    {
        String unicodeString = "";

        for (int i = 0; i < text.length(); i++) 
         { 
            char c = text.charAt(i);
            String s = String.format ("\\u%04x", (int)c);
            unicodeString = unicodeString + s;
         }
         return unicodeString;
    }

编辑2:如果有人读这篇文章很奇怪,要获取unicode的十进制值:

    public String toUnicode() 
    {
        String unicodeString = "";

        for (int i = 0; i < text.length(); i++) 
         { 
            char c = text.charAt(i);
            int unicodeDecimal = c;
            unicodeString = unicodeString + unicodeDecimal + " ";
         }
         return unicodeString;
    }

编辑3:我最终决定使用以下内容,它按空格分隔unicode小数,并检查unicode值10(表示新行)并将新行输出到字符串而不是该值。

    public String toUnicode() 
    {
        String unicodeString = "";

        for (int i = 0; i < text.length(); i++) 
         { 
            char c = text.charAt(i);
            int unicodeDecimal = c;  

            if (unicodeDecimal == 10)
            {
                unicodeString = unicodeString + "\n";
            }
            else
            {
                unicodeString = unicodeString + unicodeDecimal + " ";
            }

         }
         return unicodeString;
    }

2 个答案:

答案 0 :(得分:1)

几件事

1)移动线 在遵循代码

之后char unicodeTextArray[] = new char[text.length()];
    if (text == null || text.isEmpty())
    {
        return "";
    }
   char unicodeTextArray[] = new char[text.length()];

2)错误是因为String unicode = unicodeTextArrayString[text.length()];

例如,你得到一个文本&#34; hello&#34;,然后你初始化了大小为text.length()的unicodeTextArrayString,它是5.所以你可以从这个数组中取回索引0到4,但是你正在尝试从索引5中获取,这超出了界限。

3)说完之后,代码/逻辑似乎错了。我刚刚使用StringBuilder修改了你的逻辑。您可以检查转换逻辑

public static String toUnicode(String text)
{
 if (text == null || text.isEmpty())
{
  return "";
}
StringBuilder unicodeTextArrayString = new StringBuilder();
for (int i = 0; i < text.length(); i++)
{
  char ch = text.charAt(i);
  if (ch < 0x10)
  {
    unicodeTextArrayString.append("\\u000" + Integer.toHexString(ch));
  }
  else if (ch < 0x100)
  {
    unicodeTextArrayString.append("\\u00" + Integer.toHexString(ch));
  }
  else if (ch < 0x1000)
  {
    unicodeTextArrayString.append("\\u0" + Integer.toHexString(ch));
  }
  else
  {
    unicodeTextArrayString.append("\\u" + Integer.toHexString(ch));
  }
}

return unicodeTextArrayString.toString();
}

4)如果你想使用基于数组的方法,然后将每个字符添加到数组,然后再次遍历存储字符的数组,然后构建一个字符串(而不是从最后一个索引获取字符串)然后返回字符串

答案 1 :(得分:0)

这个是罪魁祸首

String unicode = unicodeTextArrayString[text.length()];

编辑: 如果你真的想让原始代码以某种方式工作,我认为有几种方法可以做到。以下代码就是其中之一。

public String toUnicode() {
    char unicodeTextArray[] = new char[text.length()];

    if (text == null) {
        return "";
    }

    String unicodeTextArrayString[] = new String[text.length()];

    StringBuilder unicode= new StringBuilder();
    for (int i = 0; i < text.length(); i++) {

        unicodeTextArray[i] = text.charAt(i);

        if (unicodeTextArray[i] < 0x10) {
            unicodeTextArrayString[i] = "\\u000" + Integer.toHexString(unicodeTextArray[i]);
        } else if (unicodeTextArray[i] < 0x100) {
            unicodeTextArrayString[i] = "\\u00" + Integer.toHexString(unicodeTextArray[i]);
        } else if (unicodeTextArray[i] < 0x1000) {
            unicodeTextArrayString[i] = "\\u0" + Integer.toHexString(unicodeTextArray[i]);
        } else 
            unicodeTextArrayString[i] = "\\u" + Integer.toHexString(unicodeTextArray[i]);

        unicode = unicode.append(unicodeTextArrayString[i]);
    }

    return unicode.toString();
}