Java中的StringBufferInputStream问题
我想读取输入字符串并将其作为UTF8编码字符串返回。因此,我在Oracle/Sun网站上找到了一个使用FileInputStream的示例。我不想读取文件,而是一个字符串,所以我将其更改为StringBufferInputStream,并使用下面的代码。方法参数jtext是一些日文文本实际上,这种方法效果很好。问题是关于不推荐使用的代码。我不得不添加@SuppressWarnings,因为StringBufferInputStream已被弃用。我想知道有没有更好的方法来获取字符串输入流?让它保持原样可以吗?我花了这么长时间试图解决这个问题,我不想改变任何事情,现在我似乎已经破解了它Java中的StringBufferInputStream问题,java,inputstream,Java,Inputstream,我想读取输入字符串并将其作为UTF8编码字符串返回。因此,我在Oracle/Sun网站上找到了一个使用FileInputStream的示例。我不想读取文件,而是一个字符串,所以我将其更改为StringBufferInputStream,并使用下面的代码。方法参数jtext是一些日文文本实际上,这种方法效果很好。问题是关于不推荐使用的代码。我不得不添加@SuppressWarnings,因为StringBufferInputStream已被弃用。我想知道有没有更好的方法来获取字符串输入流?让它保持
@SuppressWarnings("deprecation")
private String readInput(String jtext) {
StringBuffer buffer = new StringBuffer();
try {
StringBufferInputStream sbis = new StringBufferInputStream (jtext);
InputStreamReader isr = new InputStreamReader(sbis,
"UTF8");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}
in.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
我想我找到了一个解决方案——各种各样的:
private String readInput(String jtext) {
String n;
try {
n = new String(jtext.getBytes("8859_1"));
return n;
} catch (UnsupportedEncodingException e) {
return null;
}
}
在我绝望地使用getBytes(UTF8)之前。但我碰巧用了拉丁语-1“8859_1”,效果不错。我搞不懂它为什么起作用。这是我一步一步做的:
OpenOfficeCSV(utf8)--->SQLite(显然是utf8)--->java编码为拉丁语-1,以某种方式可读。这就是您想要做的吗?下面是关于这个问题的先前答案。我不知道为什么要将字符串转换为完全相同的字符串 Java字符串包含一个字符序列,其中每个字符表示一个Unicode数字。因此,可以从两个不同的字节序列构造相同的字符串,一个用UTF-8编码,另一个用US-ASCII编码 如果您想将其写入文件,则始终可以使用
String.getBytes(“编码器”)对其进行转换代码>
更新
这是我的假设
UTF-16表示,根据您的评论,SQLite DB使用一种编码来存储文本值。由于某些原因,SQLite APi无法确定它用于将Unicode值编码为字节序列的编码
因此,当您从SQLite API中使用getString
方法时,它会从数据库中读取一组字节,并使用错误的编码将它们转换为Java字符串。如果是这种情况,您应该使用getBytes
方法自己重新构造字符串,即新字符串(字节,“数据库中使用的编码”)代码>如果数据库存储在UTF-16中,则新字符串(字节,“UTF-16”)代码>应该是可读的
更新
我不是在谈论String
类上的getBytes
方法。我谈到了SQL结果对象上的getBytes
方法,例如result.getBytes(String-columnLabel)
您需要将readInput
方法的签名更改为
private static String readInput(byte[] bytes) {
try {
// change encoding to your DB encoding.
// this can be UTF-8, UTF-16, 8859_1, etc.
String string = new String(bytes, "UTF-8");
return string;
} catch (UnsupportedEncodingException ex) {
// do something, at least return garbled text
return new String(bytes, "UTF-8");;
}
}
无论您在这里设置了什么样的编码使字符串可读,它肯定是您的列在DB中的编码。这不涉及无法解释的现象,您确切地知道列编码是什么
但是,最好将JDBC驱动程序配置为使用正确的编码,这样就不需要使用此readInput
方法进行转换
如果没有编码可以使字符串读起来,你就需要考虑字符被写为DB的可能性,就像史蒂芬C所说的那样。如果是这种情况,使用漫游方法可能会导致在转换过程中丢失一些字符。您还需要在编写过程中解决编码问题。
这就是您要做的吗?下面是关于这个问题的先前答案。我不知道为什么要将字符串转换为完全相同的字符串
Java字符串包含一个字符序列,其中每个字符表示一个Unicode数字。因此,可以从两个不同的字节序列构造相同的字符串,一个用UTF-8编码,另一个用US-ASCII编码
如果您想将其写入文件,则始终可以使用String.getBytes(“编码器”)对其进行转换代码>
更新
这是我的假设
UTF-16表示,根据您的评论,SQLite DB使用一种编码来存储文本值。由于某些原因,SQLite APi无法确定它用于将Unicode值编码为字节序列的编码
因此,当您从SQLite API中使用getString
方法时,它会从数据库中读取一组字节,并使用错误的编码将它们转换为Java字符串。如果是这种情况,您应该使用getBytes
方法自己重新构造字符串,即新字符串(字节,“数据库中使用的编码”)代码>如果数据库存储在UTF-16中,则新字符串(字节,“UTF-16”)代码>应该是可读的
更新
我不是在谈论String
类上的getBytes
方法。我谈到了SQL结果对象上的getBytes
方法,例如result.getBytes(String-columnLabel)
您需要将readInput
方法的签名更改为
private static String readInput(byte[] bytes) {
try {
// change encoding to your DB encoding.
// this can be UTF-8, UTF-16, 8859_1, etc.
String string = new String(bytes, "UTF-8");
return string;
} catch (UnsupportedEncodingException ex) {
// do something, at least return garbled text
return new String(bytes, "UTF-8");;
}
}
无论您在这里设置了什么样的编码使字符串可读,它肯定是您的列在DB中的编码。这不涉及无法解释的现象,您确切地知道列编码是什么
但是,最好将JDBC驱动程序配置为使用正确的编码,这样就不需要使用此readInput
方法进行转换
如果没有编码可以使字符串读起来,你就需要考虑字符被写为DB的可能性,就像史蒂芬C所说的那样。如果是这种情况,使用漫游方法可能会导致在转换过程中丢失一些字符。您还需要解决写入过程中的编码问题。
该类是不推荐的StringBufferInputStream
类的新替代品
但是,您声明实际要做的是获取一个现有的字符串
,并返回编码为UTF-8的字符串。我希望你能做得更简单。比如:
s8 = new String(jtext.getBytes("UTF8"));
这个班是新来的
s8 = new String(jtext.getBytes("UTF8"));
Reader in = new StringReader(text);