2017-10-27 19 views
1

私は、SQLスクリプトを使ってファイルを読み込んでSQLite DBにデータを挿入するAndroidアプリケーションを持っています。 しかし、私はこのファイルのexatlyエンコーディングを知っている必要があります、私はSQLiteから情報を読み取るEditTextがあり、エンコーディングが正しくない場合は、 "?"のような無効な文字として表示されます「ç、í、ã」のような文字の代わりに。java ISO-8859-1とUTF-8をエンコードするファイルを区別する方法は?

I次のコードを持っている:

FileInputStream fIn = new FileInputStream(myFile); 
BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn, "ISO-8859-1")); 
String aDataRow; 
while ((aDataRow = myReader.readLine()) != null) { 
    if(!aDataRow.isEmpty()){ 
     String[] querys = aDataRow.split(";"); 
     Collections.addAll(querysParaExecutar, querys); 
    } 
} 
myReader.close(); 
これは文字セットとして "ISO-8859-1" のエンコードのために働く、と私は、 "UTF-8" に設定した場合、UTF-8のために働く

。私はプログラムでcharsetエンコーディング(UTF-8またはISO-8859-1)を検出し、正しいコードをコードに適用する必要があります。 これを行う簡単な方法はありますか?

+5

エンコードされた文字データのみから文字エンコードを判別するための確実な方法はありません。一般的な仕組みは、コンテンツとは別に指定するエンコーディングに依存するというヒューリスティックなアプローチがあります。 –

+0

通常、エンコーディングはデータを挿入した人か、コンテンツ – sdfbhg

+0

とは別に指定されていますが、問題は次のとおりです。私のユーザーはファイルを編集する予定です。メモ帳で編集して保存すると、 "ISO-8859-1"としてエンコードします。オリジナルのファイルエンコーディングは "UTF-8"です。 –

答えて

0

lib universal chardetの問題を解決しました。 期待通りにうまくいきます。

FileInputStream fIn = new FileInputStream(myFile); 
      byte[] buf = new byte[4096]; 
      UniversalDetector detector = new UniversalDetector(null); 
      int nread; 
      while ((nread = fIn.read(buf)) > 0 && !detector.isDone()) { 
       detector.handleData(buf, 0, nread); 
      } 
      detector.dataEnd(); 
      String encoding = detector.getDetectedCharset(); 
      String chartsetName = null; 
      if (encoding.equalsIgnoreCase("WINDOWS-1252")){ 
       chartsetName = "ISO-8859-1"; 
      } 
      if (encoding.equalsIgnoreCase("UTF-8")){ 
       chartsetName = "UTF-8"; 
      } 

      BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn, chartsetName)); 
関連する問題