我在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编码,receiveText字符串中的字符是对于印地文字符的扩展ASCII形式
新修改
我有新角色
String value = "?®Á?Ƕ ¡??°¿¯¾";
在印度的印地文和丹加里亚说मुकेश。谷歌翻译不是在印地文翻译dangaria所以我不能提供你的印地文版本。
我跟那个正在编码的人说过,他说他在编码之前从输入中删除了2位,即如果\ u0905在印地语中表示अ,那么他从输入中删除\ u09并以扩展的十六进制形式转换剩余的05。
所以我提供给你的新输入字符串是以上面的解释形式解码的。即\ u09已被删除,休息被转换为扩展的ascii,然后使用USB发送到设备。
请告诉我这个解释是否有助于您找到解决方案
答案 0 :(得分: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()));
这些是否是预期的字符是你需要告诉我的事情:)
另外,我不确定Android中是否有x-ISCII91
字符编码。
答案 1 :(得分: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替换为导致你的loooong String的实际charsed。
答案 2 :(得分:1)
通常,对于您知道为字符串值的字节数组,您可以使用以下内容。
假设byte[] someBytes
:
String stringFromBytes = new String(someBytes, "UTF-16");
您可以将“UTF-16”替换为适当的字符集,您可以在进行一些实验后找到它。详细说明java支持的字符编码的link可能会有所帮助。
根据您提供的详细信息,我建议您考虑以下事项: