1

次のような拡張ASCII文字の形式で、AndroidのUSB通信を介して文字列テキストを受信して​​います

String receivedText = "5286T11ɬ ªË ¦¿¯¾ ¯¾ ɬ ¨¬°:A011605286 ª¿ª ¾®:12:45 ¸Í®°:(9619441121)ª¿ª:-, ®¹¿¦Í°¾ ¡ ®¹¿¦Í°¾ ª¨À, ¾¦¿µ²À ¸Í, ¾¦¿µ²À ªÂ°Íµ °¿®¾°Í͸:- ¡Í°Éª:-, ¬¾¹°, ¸¾¤¾Í°Â¼ ªÂ°Íµ~";

現在、これらの文字はヒンディー語の文字列を表しています。

この受信した文字列をヒンディー語の同等のテキストに変換する方法がわかりません。Javaを使用してこれを同等のヒンディー語テキストに変換する方法を知っている人は誰でも

以下は、バイト配列をバイト文字列に変換するために使用しているコードです

public String byteArrayToByteString(byte[] arayValue, int size) {
        byte ch = 0x00;
        int i = 0;

        if (arayValue == null || arayValue.length <= 0)
            return null;

        String pseudo[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                "A", "B", "C", "D", "E", "F" };
        StringBuffer out = new StringBuffer();

        while (i < size) {

            ch = (byte) (arayValue[i] & 0xF0); // Strip off high nibble
            ch = (byte) (ch >>> 4); // shift the bits down
            ch = (byte) (ch & 0x0F); // must do this is high order bit is on!
            out.append(pseudo[(int) ch]); // convert the nibble to a String
            // Character
            ch = (byte) (arayValue[i] & 0x0F); // Strip off low nibble
            out.append(pseudo[(int) ch]); // convert the nibble to a String
            // Character
            i++;
        }
        String rslt = new String(out);

        return rslt;
    }

これが解決策を見つけるのに役立つかどうか教えてください

編集:

UTF-16 エンコーディングであり、receivedText 文字列内の文字は、ヒンディー語文字の拡張 ASCII 形式です。

新しい編集

新しいキャラクターがいます

String value = "?®Á?Ƕ ¡??°¿¯¾";

ヒンディー語ではमुकेश、ヒンディー語ではダンガリアと言います。Google翻訳者はダンガリアをヒンディー語に翻訳していないので、ヒンディー語版を提供することはできません.

エンコードを行っている人に話を聞いたところ、エンコード前に入力から 2 ビットを削除したとのことでした。

したがって、私が提供した新しい入力文字列は、上記の説明の形式でデコードされます。つまり、\u09 は削除され、残りは拡張 ASCII に変換され、USB を使用してデバイスに送信されます。

この説明が解決策を見つけるのに役立つかどうか教えてください

4

3 に答える 3

3

私はこれで少し遊んでいて、あなたが何をする必要があるかについての考えを持っています. なんらかの理由で、投稿の値receivedTextがエンコードされているようです。windows-1252おそらくこの投稿に貼り付けたからでしょう。エンコーディング エラーを回避するには、未加工のバイト値を提供することをお勧めします。とにかく、String次の Unicode デーバナーガリー文字にそれを入れることができました。

5286T11फए ऋभ इडऒठ ऒठ फए उएओ:A011605286 ऋडऋ ठऍ:12:45 चयऍओ:(9619441121)ऋडऋ:-, ऍछडइयओठ ँ ऍछडइयओठ ऋउढ, ठइडगऑढ चय, ठइडगऑढ ऋतओयग ओडऍठओययच:- ँयओफऋ:-, एठछओ, चठअठयओतञ ऋतओयग~

次のコードを使用します。

final String receivedText = "5286T11ɬ ªË ¦¿¯¾ ¯¾ ɬ ¨¬°:A011605286 ª¿ª ¾®:12:45 ¸Í®°:(9619441121)ª¿ª:-, ®¹¿¦Í°¾ ¡ ®¹¿¦Í°¾ ª¨À, ¾¦¿µ²À ¸Í, ¾¦¿µ²À ªÂ°Íµ °¿®¾°Í͸:- ¡Í°Éª:-, ¬¾¹°, ¸¾¤¾Í°Â¼ ªÂ°Íµ~";

final Charset fromCharset = Charset.forName("x-ISCII91");
final CharBuffer decoded = fromCharset.decode(ByteBuffer.wrap(receivedText.getBytes("windows-1252")));

final Charset toCharset = Charset.forName("UTF-16");
final byte[] encoded = toCharset.encode(decoded).array();
System.out.println(new String(encoded, toCharset.displayName()));

それらが期待される文字であるかどうかは、あなたが私に言う必要があるものです:)

また、x-ISCII91文字エンコーディングが Android で使用できるかどうかもわかりません。

于 2013-02-25T17:48:18.487 に答える
1

通常、文字列値であることがわかっているバイト配列の場合は、次を使用できます。

仮定byte[] someBytes

String stringFromBytes = new String(someBytes, "UTF-16");

「UTF-16」を適切な文字セットに置き換えることができます。これは、いくつかの実験の後に見つけることができます。Java でサポートされている文字エンコーディングの詳細を示すこのリンクが役立つ場合があります。

あなたが提供した詳細から、次のことを検討することをお勧めします。

  • USB ドライブからファイルを読み取る場合、android には、より標準的な方法でこれを行うのに役立つ既存のフレームワークがある場合があります。
  • USB ポートからバイトを直接読み込んで操作する必要が最も確実にある場合は、読み込んでいるデータの API/プロトコルに精通していることを確認してください。一部のバイトは、文字列に変換できない制御メッセージまたは同様のものである可能性があり、バイト ストリーム内のどこで文字列が開始 (および終了) するかを正確に特定する必要があります。
于 2013-02-22T13:54:29.287 に答える
1
hindi = new String(receivedText.getBytes(), "UTF-16");

しかし、これは実際にはヒンディー語のようには見えません.. UTF-16 としてエンコードされていますか?

編集:

String charset = "UTF-8";
hindi = new String(hindi.getBytes(Charset.forName(charset)), "UTF-16");

UTF-8 を、長すぎる文字列になった実際の文字列に置き換えます。

于 2013-02-04T10:23:26.107 に答える