问题描述
我在一类中有一个字符串“ 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;
}
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()];
例如,您得到一个文本为“ hello”,然后初始化了大小为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)如果要使用基于数组的方法,则将每个字符添加到数组,然后再次遍历u存储字符的数组,然后构建一个字符串(而不是从上一个索引中获取字符串),然后返回该字符串
2楼
这是罪魁祸首
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();
}