3

Windows のすべての特殊文字を Unicode に相当するものに変換しようとしています。ユーザーがリッチ テキストを保存すると、それが Java Emailer を介して受信者に電子メールで送信される Flex アプリケーションがあります。ただし、電子メールに ? として表示される Word の特殊文字が引き続き使用されます。

これまで私は試しました

 private String replaceWordChars(String text_in) {
    String s = text_in;

    // smart single quotes and apostrophe
    s = s.replaceAll("[\\u2018|\\u2019|\\u201A]", "\'");
    // smart double quotes
    s = s.replaceAll("[\\u201C|\\u201D|\\u201E]", "\"");
    // ellipsis
    s = s.replaceAll("\\u2026", "...");
    // dashes
    s = s.replaceAll("[\\u2013|\\u2014]", "-");
    // circumflex
    s = s.replaceAll("\\u02C6", "^");
    // open angle bracket
    s = s.replaceAll("\\u2039", "<");
    // close angle bracket
    s = s.replaceAll("\\u203A", ">");
    // spaces
    s = s.replaceAll("[\\u02DC|\\u00A0]", " ");

    return s;

これは機能しますが、すべての Windows-1252 文字を同等の UTF-16 に手動でエンコードしたくありません (デフォルトの Java 文字セットがそうであると仮定します)。

しかし、私たちのユーザーは、Java だけでは処理できない Microsoft Word の文字を見つけ続けています。だから私は検索して検索し、この例を見つけました

private String replaceWordChars(String text_in) {
    String s = text_in;
    try {
        byte[] b = s.getBytes("Cp1252");
        byte[] encoded = new String(b, "Cp1252").getBytes("UTF-16");
        s = new String(encoded, "UTF-16");


    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return s;

しかし、Eclipse デバッガーでエンコーディングが行われるのを見ても、何も変わりません。

Microsoft の素敵な Java エンコーディングに対処するには、簡単な解決策が必要です。

何かご意見は?

4

3 に答える 3

4

あなたは使用してみることができますjava.nio.charset.Charset

final Charset windowsCharset = Charset.forName("windows-1252");
final Charset utfCharset = Charset.forName("UTF-16");
final CharBuffer windowsEncoded = windowsCharset.decode(ByteBuffer.wrap(new byte[] {(byte) 0x91}));
final byte[] utfEncoded = utfCharset.encode(windowsEncoded).array();
System.out.println(new String(utfEncoded, utfCharset.displayName()));
于 2012-09-27T21:45:38.547 に答える
2

次の手順を使用します。

  1. InputStreamReaderソース ファイルのエンコーディングを使用して を作成します(Windows-1252)
  2. OutputStreamWriter宛先ファイルのエンコーディング (UTF-16) を使用して を作成します
  3. リーダーから読み取った情報をライターにコピーします。とを使用BufferedReaderBufferedWriterて、内容を 1 行ずつ書き込むことができます。

したがって、コードは次のようになります。

public void reencode(InputStream source, OutputStream dest,
        String sourceEncoding, String destEncoding)
        throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(source, sourceEncoding));
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dest, destEncoding));
    String in;
    while ((in = reader.readLine()) != null) {
        writer.write(in);
        writer.newLine();
    }
}

もちろん、これは try/catch のものを除外し、呼び出し元に委譲します。

コンテンツをある種の文字列として取得しようとしているだけの場合は、 を に置き換えて、writerその値StringWriterを返すことができます。toString次に、宛先ストリームやエンコーディングは必要なく、文字をダンプする場所だけが必要です。

public String decode(InputStream source, String sourceEncoding)
        throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(source, sourceEncoding));
    StringWriter writer = new StringWriter();
    String in;
    while ((in = reader.readLine()) != null) {
        writer.write(in);
        writer.write('\n'); // Java newline should be fine, test this just in case
    }
    return writer.toString();
}
于 2012-09-27T21:22:26.957 に答える
1

私がテストしたすべてのものに対してこれまでのところうまくいくように見えるのは次のとおりです。

private String replaceWordChars(String text_in) {
    String s = text_in;
    
    final Charset windowsCharset = Charset.forName("windows-1252");
    final Charset utfCharset     = Charset.forName("UTF-16");
    
    byte[] incomingBytes = s.getBytes();
    final CharBuffer windowsEncoded = 
        windowsCharset.decode(ByteBuffer.wrap(incomingBytes)); 
    
    final byte[] utfEncoded = utfCharset.encode(windowsEncoded).array();
    s = new String(utfEncoded);
    
    return s;
}
于 2012-09-27T22:30:44.183 に答える