3

(ヘッダーを介して)としてエンコードされたWebページがありWIN-1255ます。Javaプログラムは、ページに自動的に埋め込まれるテキスト文字列を作成します。問題は、元の文字列がUTF-8でエンコードされているため、ページにGibberishテキストフィールドが作成されることです。

残念ながら、ページのエンコードを変更することはできません。これは、顧客の適切なシステムで必要です。

何か案は?

アップデート:

私が作成しているページは、WIN-1255に設定する必要があるRSSフィードであり、UTF-8でエンコードされた別のフィードから取得した情報を示しています。

2回目の更新:

すべての回答をありがとう。私はなんとか文字列を変換できましたが、それでもギブリッシュです。問題は、ヘッダーエンコーディングに加えてXMLエンコーディングを設定する必要があることでした。

アダム

4

5 に答える 5

2

要するに、応答 writerのエンコーディングを設定する必要があります。応答ヘッダーのみを使用すると、基本的に、ページの解釈/表示に使用するエンコーディングをクライアント アプリケーションに指示するだけです。応答自体が異なるエンコーディングで記​​述されている場合、これは機能しません。

この問題が発生しているコンテキストは完全に不明です (このような今後の問題についても詳しく説明してください)。そのため、いくつかの解決策を次に示します。

JSP の場合は、JSP の先頭に次を設定して、応答エンコーディングを設定する必要があります。

<%@ page pageEncoding="WIN-1255" %>

サーブレットの場合、最初のフラッシュの前に次を設定して、応答エンコーディングを設定する必要があります。

response.setCharacterEncoding("WIN-1255");

ちなみに、どちらも自動的に暗黙的にContent-Type応答ヘッダーにcharsetパラメーターを設定して、クライアントに同じエンコーディングを使用してページを解釈/表示するように指示します。詳しくはこちらの記事もご覧ください。

java.net基本的な APIやAPIに依存する自家製アプリケーションの場合は、エンコーディングを指定できる2 つの引数を取るコンストラクタを使用して構築されjava.ioた を通じて文字を書き込む必要があります。OutputStreamWriter

Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255");
于 2010-02-03T12:06:40.343 に答える
1

元の (適切に表現された) 文字列を制御でき、それらを win-1255 で出力する必要があると仮定します。

import java.nio.charset.*;
import java.nio.*;
Charset win1255 = Charset.forName("windows-1255");
ByteBuffer bb = win1255.encode(someString);
byte[] ba = new byte[bb.limit()];

次に、適切な場所に ba の内容を書き込むだけです。

編集: ba で何をするかは、環境によって異なります。たとえば、サーブレットを使用している場合は、次のようにします。

ServletOutputStream os = ...
os.write(ba);

setContentType("text/html; charset=windows-1255")また、 ( setContentType ) を呼び出してからgetWriterを通常どおり使用するという可能なアプローチも見逃してはなりません。windows-1255 がメタ タグに設定されているのか、HTTP 応答ヘッダーに設定されているのかは完全には明確ではありませんでした。

デコードする必要がある UTF-8 ファイルがあることを明確にしました。UTF-8 文字列をまだ適切にデコードしていない場合、これは大した問題ではありません。InputStreamReader ( someInputStream , Charset.forName("utf-8")) を見てください

于 2010-02-03T10:39:48.733 に答える
0
byte[] originalUtf8;//Here input

//utf-8 to java String:
String internal = new String(originalUtf8,Charset.forName("utf-8");
//java string to w1255 String
byte[] win1255 = internal.getBytes(Charset.forName("cp1255"));

//Here output
于 2010-02-03T11:13:54.687 に答える
0

ページにデータを埋め込んでいるのは何ですか? テキストとして (UTF-8 で) 読み取り、Web ページのエンコーディング (Win-1255) で再度書き出すか、Java プログラムを変更して Win-1255 でファイル (または何でも) を作成して起動する必要があります。と。

システムがどのように機能するか (Web ページを生成しているのは何か? Java プログラムとどのように相互作用するのか?) について詳しく教えていただければ、より明確になります。

于 2010-02-03T10:35:12.627 に答える
0

私が作成しているページは、UTF-8 でエンコードされた別のフィードから取得した情報を表示する、WIN-1255 に設定する必要がある RSS フィードです。

この場合、パーサーを使用して UTF-8 XML をロードします。これにより、データが UTF-16 文字データに正しくデコードされます (Java 文字列は常に UTF-16 です)。出力メカニズムは、UTF-16 から Windows-1255 にエンコードする必要があります。

于 2010-02-03T11:00:07.360 に答える