我有一个字符串" 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;
}
答案 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();
}