1

我正在通过 android 中的 USB 通信以扩展 ASCII 字符的形式接收字符串文本,例如

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 = "?®Á?Ƕ ¡??°¿¯¾";

印地语中的मुकेश和印地语中的dangaria。谷歌翻译器不会翻译印地语的 dangaria,所以我无法为您提供印地语版本。

我与正在编码的人交谈,他说他在编码之前从输入中删除了 2 位,即如果 \u0905 在印地语中表示 अ,那么他从输入中删除 \u09 并将剩余的 05 转换为扩展的十六进制形式。

因此,我提供给您的新输入字符串以上述解释的形式进行了解码。即 \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
hindi = new String(receivedText.getBytes(), "UTF-16");

但这看起来不像印地语……你确定它被编码为 UTF-16 吗?

编辑:

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

用导致您的 loooong 字符串的实际字符替换 UTF-8。

于 2013-02-04T10:23:26.107 回答
1

通常,对于您知道是字符串值的字节数组,您可以使用以下内容。

假设byte[] someBytes

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

您可以将“UTF-16”替换为适当的字符集,经过一些实验可以找到。这个详细说明java支持的字符编码的链接可能会有所帮助。

根据您提供的详细信息,我建议考虑以下事项:

  • 如果您正在从 USB 驱动器读取文件,android 可能有现有的框架可以帮助您以更标准的方式执行此操作。
  • 如果您确实需要直接从 USB 端口读取和操作字节,请确保您熟悉正在读取的数据的 API/协议。可能某些字节是控制消息或无法转换为字符串的类似内容,您需要准确识别字符串在字节流中的开始(和结束)位置。
于 2013-02-22T13:54:29.287 回答