4

ファイルのエンコーディングを ANSI (windows-1252) から UTF8 に変更する必要があります。私はJavaを介してそれを行うために以下のプログラムを書きました。このプログラムは文字をUTF8に変換しますが、メモ帳++でファイルを開くと、エンコーディングタイプがANSIとしてUTF8として表示されました。このファイルをアクセス データベースにインポートすると、エラーが発生します。UTF8 エンコーディングのみのファイルが望ましいです。また、要件は、ファイルをエディターで開かずに変換することです。

public class ConvertFromAnsiToUtf8 {

    private static final char BYTE_ORDER_MARK = '\uFEFF';
    private static final String ANSI_CODE = "windows-1252";
    private static final String UTF_CODE = "UTF8";
    private static final Charset ANSI_CHARSET = Charset.forName(ANSI_CODE);

    public static void main(String[] args) {

        List<File> fileList;
        File inputFolder = new File(args[0]);
        if (!inputFolder.isDirectory()) {
            return;
        }
        File parentDir = new File(inputFolder.getParent() + "\\"
                    + inputFolder.getName() + "_converted");

        if (parentDir.exists()) {
            return;
        }
        if (parentDir.mkdir()) {

        } else {
            return;
        }

        fileList = new ArrayList<File>();
        for (final File fileEntry : inputFolder.listFiles()) {
            fileList.add(fileEntry);
        }

        InputStream in;

        Reader reader = null;
        Writer writer = null;
        try {
            for (File file : fileList) {
                in = new FileInputStream(file.getAbsoluteFile());
                reader = new InputStreamReader(in, ANSI_CHARSET);

                OutputStream out = new FileOutputStream(
                            parentDir.getAbsoluteFile() + "\\"
                                            + file.getName());
                writer = new OutputStreamWriter(out, UTF_CODE);
                writer.write(BYTE_ORDER_MARK);
                char[] buffer = new char[10];
                int read;
                while ((read = reader.read(buffer)) != -1) {
                    System.out.println(read);
                    writer.write(buffer, 0, read);
                }
            }
            reader.close();
            writer.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

どんなポインタも役に立ちます。

ありがとう、アシッシュ

4

2 に答える 2

5

投稿されたコードは、windows-1252 から UTF-8 に正しくトランスコードされます。

「ANSI as UTF-8」には明確な意味がないため、Notepad++ メッセージは混乱を招きます。Notepad++の未解決の欠陥のようです。Notepad++ はBOM なしの UTF-8 を意味すると思います(エンコーディング メニューを参照してください)。

Windows プログラムである Microsoft Access は、おそらく UTF-8 ファイルがバイト オーダー マーク ( BOM ) で始まることを想定しています。

ファイルの先頭にコード ポイント U+FEFF を記述することで、ドキュメントに BOM を挿入できます。

import java.io.*;
import java.nio.charset.*;

public class Ansi1252ToUtf8 {
  private static final char BYTE_ORDER_MARK = '\uFEFF';

  public static void main(String[] args) throws IOException {
    Charset windows1252 = Charset.forName("windows-1252");
    try (InputStream in = new FileInputStream(args[0]);
        Reader reader = new InputStreamReader(in, windows1252);
        OutputStream out = new FileOutputStream(args[1]);
        Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
      writer.write(BYTE_ORDER_MARK);
      char[] buffer = new char[1024];
      int read;
      while ((read = reader.read(buffer)) != -1) {
        writer.write(buffer, 0, read);
      }
    }
  }
}
于 2013-03-12T10:06:45.703 に答える