检查字符串是否可编码在Gsm0338
问题描述:
我正在处理一个SMS应用程序,并发送Unicode字符(阿姆哈拉语/ G'eez)。我正在使用this example。线路240,isEncodeableInGsm0338()
上的方法用于检查我是否应该使用其他编码或默认编码。检查字符串是否可编码在Gsm0338
这里是捕捉。字符串"የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።"
显然是Unicode,它从该方法返回。我的假设是每封信的一半。但我不能支持这个理论。如果我将文本更改为"1. የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።"
,它会正确检测。
这里发生了什么?
答
Got it!
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()
这是编码依赖。解决方案是通过使用isoString.toCharArray()
来获取字符数组来比较每个char
。
改变
byte[] isoBytes = isoString.getBytes();
到
char[] isoBytes = isoString.toCharArray();
你可能想命名isoBytes
别的东西了。奇迹般有效。
示例代码使用String.getBytes()。这取决于“平台默认编码”。我看不到应该是哪种编码。你最好在这个字符集中构造一个包含所有允许字符的字符串GSM_0338,并且对于你的SMS文本中的每个字符,检查它是否包含在这个字符串中。对于检查,我没有看到从SMS文本创建字节的必要性。 –
@RalfKleberhoff这有帮助。谢谢 –
为什么不只是'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/)。 –