文字列をISO-8859-1からUTF-8に変換し、Javaに戻す方法を知っている人はいますか?
Webから文字列を取得してRMS(J2ME)に保存していますが、特殊文字を保持し、RMSから文字列を取得したいのですが、ISO -8859-1エンコード。どうすればいいですか?
一般に、これはできません。 UTF-8は、Unicodeコードポイントをエンコードできます。 ISO-8859-1は、ほんの一部しか処理できません。したがって、ISO-8859-1からUTF-8へのトランスコーディングは問題ありません。 UTF-8からISO-8859-1に戻ると、サポートされていない文字が見つかったときにテキストに「置換文字」(�)が表示されます。
テキストをトランスコードするには:
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
または
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
下位レベルの Charset
APIを使用することで、より細かく制御できます。たとえば、エンコードできない文字が見つかった場合に例外を発生させたり、置換テキストに別の文字を使用したりできます。
私のために働いた:( "üzümbağları"はトルコ語で書かれた正しいです)
ISO-8859-1をUTF-8に変換します。
String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"
UTF-8をISO-8859-1に変換する
String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
String
があれば、それを行うことができます:
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
「壊れた」String
がある場合は、何か間違ったことをしました。別のエンコーディングでString
をString
に変換することは、間違いなく進むべき方法ではありません。 String
をbyte[]
に、またはその逆に変換できます(エンコードが指定された場合)。 Java String
sでは、UTF-16
でエンコードされたAFAIKですが、これは実装の詳細です。
InputStream
がある場合、byte[]
を読み取り、それを使用してString
に変換できます
byte[] bs = ...;
String s;
try {
s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
またはさらに良い(エリクソンのおかげで)InputStreamReader
を使用してください:
InputStreamReader isr;
try {
isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
文字列出力を使用した簡単な方法を次に示します(これを行うメソッドを作成しました)。
public static String (String input){
String output = "";
try {
/* From ISO-8859-1 to UTF-8 */
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
/* From UTF-8 to ISO-8859-1 */
output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return output;
}
// Example
input = "Música";
output = "Música";
正規表現も有効で効果的に使用できます(ISO-8859-1
でカバーされていないすべてのUTF-8文字をスペースに置き換えます):
String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
+ " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
以下は、UNICODE(ISO_8859_1)をUTF-8に変換する関数です
public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
final char ch = strISO_8859_1.charAt(i);
if (ch <= 127)
{
stringBuilder.append(ch);
}
else
{
stringBuilder.append(String.format("%02x", (int)ch));
}
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}
TEST
String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));
結果
ISO_8859_1 strA est =اÙغÙاÙString_ISO_8859_1To_UTF_8 =الغلاف
Apache Commons IO Charsets class が役立ちます:
String utf8String = new String(org.Apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())