2017-08-07 7 views
1

私はSMSアプリケーションで作業しており、Unicode文字(Amharic/G'eez)を送信します。私はthis exampleを使用しています。メソッド240isEncodeableInGsm0338()を使用して、別のエンコードまたはデフォルトのエンコードを使用する必要があるかどうかを確認します。文字列がエンコード可能かどうかを確認するにはGsm0338

ここにキャッチがあります。明らかにUnicodeである文字列"የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።"が、そのメソッドから戻ります。私の仮説は各手紙の半分です。しかし、私はその理論を支持することはできません。テキストを"1. የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።"に変更すると、正しく検出されます。

ここで何が起こっているか

+0

例のコードではString.getBytes()を使用しています。そしてそれは "プラットフォームのデフォルトエンコーディング"に依存します。どのエンコーディングがあるのか​​分かりません。この文字セット内のすべての文字のGSM_0338文字列を作成し、SMSテキストの各文字について、この文字列に含まれているかどうかを確認することをお勧めします。チェックのために、SMSテキストからバイトを作成する必要はありません。 –

+0

@RalfKleberhoffそれが役に立ちます。ありがとう –

+0

'isEncodeableInGsm0338()' isoString.getBytes( "GSM_0338") 'を呼び出して、成功すればtrueを返し、失敗した場合はfalseを返します。それとも、['GsmCharsetProvider'](https://github.com/ixonos/jcimd/blob/master/src/main/java/com/googlecode/jcimd/charset/GsmCharsetProvider.java)や[Java GSM 03.38 SMS文字セット翻訳者](https://embeddedfreak.wordpress.com/2008/10/08/java-gsm-0338-sms-character-set-translator/)。 –

答えて

0

ありがとうございました!

line 240の方法は以下の通りです。

public static boolean isEncodeableInGsm0338(String isoString) { 
     byte[] isoBytes = isoString.getBytes(); 
     outer: 
     for (int i = 0; i < isoBytes.length; i++) { 
      for (int j = 0; j < isoGsm0338Array.length; j++) { 
       if (isoGsm0338Array[j] == isoBytes[i]) { 
        continue outer; 
       } 
      } 
      for (int j = 0; j < extendedIsoGsm0338Array.length; j++) { 
       if (extendedIsoGsm0338Array[j][1] == isoBytes[i]) { 
        continue outer; 
       } 
      } 
      return false; 
     } 
     return true; 
    } 

ご覧のとおり、エンコードに依存するisoString.getBytes()が使用されています。解決策は、それぞれを使用して文字配列を取得することによって各charを比較することです。

char[] isoBytes = isoString.toCharArray();

変更

byte[] isoBytes = isoString.getBytes();

あなたも何か他のものにisoBytesに名前を付けることもできます。魅力のように動作します。

関連する問題