将扩展的 ASCII 字符串转换为印地语文本
Posted
技术标签:
【中文标题】将扩展的 ASCII 字符串转换为印地语文本【英文标题】:Converting extended ASCII string to hindi text 【发布时间】:2013-01-18 23:55:59 【问题描述】:我正在通过 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 发送到设备。
如果这个解释能帮助你找到解决方案,请告诉我
【问题讨论】:
如果是 Java 字符串,则为 Unicode (UTF-16)。如果是其他字符串,则为损坏的字符串。展示如何将设备中的字节转换为字符串。 实际上这个字符串是从他们用来显示印地语文本的硬件接收的,我认为它是一个 UTF-16 文本,但我不知道如何转换它。我以字节数组的形式收到它,然后将其转换为字符串 您也可以创建自己的本地对象并使用它:docs.oracle.com/javase/tutorial/i18n/locale/create.html 你能显示接收到的字符串实际上应该是什么样子吗?这样可以更轻松地找到从一个到另一个的转化。 【参考方案1】:我一直在玩这个,并且知道您可能需要做什么。出于某种原因,您在帖子中拥有的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 中可用。
【讨论】:
您的解决方案看起来很可能是正确的(即使我不知道印地语)。我正在寻找一个字符集,当使用默认编码而不是正确的编码解码时,它会提供有问题的字符串,但它看起来你打赌我。干杯! 非常好的尝试@laz,字符是印地语但输出不正确,即输出不是正确的印地语。我赞成你的努力:)【参考方案2】:一般来说,对于一个你知道是字符串值的字节数组,你可以使用下面的。
假设byte[] someBytes
:
String stringFromBytes = new String(someBytes, "UTF-16");
您可以将“UTF-16”替换为适当的字符集,经过一些实验可以找到。这个link 详细介绍了 java 支持的字符编码可能会有所帮助。
根据您提供的详细信息,我建议您考虑以下几点:
如果您从 USB 驱动器读取文件,Android 可能有现有的框架可以帮助您以更标准的方式执行此操作。 如果您确实需要直接从 USB 端口读取和操作字节,请确保您熟悉正在读取的数据的 API/协议。可能某些字节是控制消息或无法转换为字符串的类似内容,您需要准确识别字符串在字节流中的开始(和结束)位置。【讨论】:
我已经尝试过这个东西,但没有成功将它转换成印地语 你确定整个字节数组都是字符串数据吗?我不熟悉 USB 通信协议,但也许该数组包含额外的协议相关字节?如果它只是字符串数据,并且您已经尝试过所有 Java 的标准字符集,那么它将向我表明该字符串的标准编码较低,您将不得不从您的规范中挖掘一些信息,以了解这种编码可能是什么. 我以字节数组的形式接收到 receivedText(String from my question)。我试图将其转换为您在答案中所写的形式。但仍然没有输出。 你能提供你用来接收字节数组的方法的签名吗? int com.hoho.android.usbserial.driver.UsbSerialDriver.read(byte[] arg0, int arg1) 抛出 IOException【参考方案3】: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 字符串的实际字符。
【讨论】:
但是一般的方式会起作用。找出哪个字符集导致了您的 receivedText,然后使用该字符集从您的文本中提取字节,然后从该字节中创建一个新字符串并使用正确的编码(可能是 UTF-16)。跨度> @MarcMosby 将损坏的字符串编码为 UTF-8 并将其解码为 UTF-16 的提议不太可能奏效。数据已经损坏。这些转码操作通常具有破坏性,因为非法或不受支持的序列被转换为替换字符。 尝试将系统编码设置为utf-16
:System.setProperty("file.encoding","UTF-16")
;以上是关于将扩展的 ASCII 字符串转换为印地语文本的主要内容,如果未能解决你的问题,请参考以下文章
Android:将英文数字字符串显示为印地语或任何语言数字字符串
将非 ASCII 字符从 ASCII-8BIT 转换为 UTF-8