5

タイトルが言うように...私はhtto応答からコンテンツを読みました

 

    InputStream is = response.getEntity().getContent();
    String cw = IOUtils.toString(is);
    byte[] b = cw.getBytes("Cp1250");
    String x = StringUtils.newStringUtf8(b);
    String content = new String(b, "UTF-8");

    System.out.println(content);

 

私はたくさんのバリエーションを試しました。文字列として使用される正しいエンコーディング定数とは何かについて、私は少し混乱しています。windows-1250またはCp1250。UTF-8またはutf-8またはutf8?

4

5 に答える 5

6

Stringオブジェクトにはエンコーディングがあると思われるかもしれません。それは正しくありません。エンコーディングは、バイナリデータ(abyte[]またはInputStream)からテキストデータ(aStringまたはchar[]など)への変換の一部として使用されます。

何が行われているのかは明確ではありませんIOUtils.toStringが、ほぼ確実にデータが失われているか、少なくとも不適切に処理されています。データが元々Windows-1250にある場合は、コンストラクター呼び出しで文字セットを指定して、InputStreamReaderラッピングを使用する必要があります。InputStreamInputStreamReader

UTF-8がどこから来るのかは明確ではありません。後でUTF-8でデータを書き出すことbyte[]もできますが、その結果は文字列ではなく、になります。

于 2012-07-07T18:31:55.503 に答える
5

逆方向に変換しています。入力データをbyte配列として取得してから、を使用String(byteArray, "Cp1250")してStringオブジェクトを作成する必要があります。次に、UTF-8が必要な場合は、を使用しますString.getBytes("UTF-8")

于 2012-07-07T18:24:28.327 に答える
3

エンコーディングには、正規の(一意の)名前とその他のさまざまな名前があり、大文字と小文字は区別されません。たとえば、「UTF-8」は正規名ですが、一部のJavaバージョンでは「UTF8」でした。それはより一般的な使用法に書かれました。HTMLページでも見られる「Windows-1250」も同様です。「Cp1250」(コードページ)はJavaの内部名です。

Javaではbyte[]はバイナリデータであり、String(内部的にはUnicode)はテキストです。 両方の間の変換にはエンコーディングが必要ですが、多くの場合オプションですが、オペレーティングシステムのデフォルトを使用します。

バイト、InputStream、OutputStream <->文字列、文字、リーダー、ライター

String cw = IOUtils.toString(is, "UTF-8"); // InputStream is binary gives byte[], hence give encoding
byte[] b = cw.getBytes("Cp1250");
String x = new String(b, "Cp1250");
String content = s;

System.out.println(content);

このユニバーサル(quaエンコーディング)Stringを許可するために、Stringは内部でchar、UTF-16を使用します。文字列定数は、UTF-8(よりコンパクト)として.classファイルに保存されます。

于 2012-07-07T19:08:43.823 に答える
1

Apache Commons IOを想定して、エンコーディングを指定するメソッドの1つを使用します。

String cw = IOUtils.toString(is, "windows-1250");

すべての文字列は、Javaでは暗黙的にUTF-16です。他のエンコーディングは通常、バイト配列を使用して表されます。

于 2012-07-07T18:53:11.357 に答える
-1

さまざまな文字セットを読み取るためにScannerを使用する方が良いと思います。

    FileInputStream is = new FileInputStream(fileOrPath);
    Scanner scanner = new Scanner(is, "cp1250");
    String out = scanner.next();

また、メソッドはアプリケーションの文字セットで値をnext()返しStringます。

「cp1250」から「UTF-8」までの「チェコ語」でテスト済み。

于 2015-04-22T17:40:30.627 に答える