2017-08-07 36 views
1

我正在处理一个SMS应用程序,并发送Unicode字符(阿姆哈拉语/ G'eez)。我正在使用this example。线路240,isEncodeableInGsm0338()上的方法用于检查我是否应该使用其他编码或默认编码。检查字符串是否可编码在Gsm0338

这里是捕捉。字符串"የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።"显然是Unicode,它从该方法返回。我的假设是每封信的一半。但我不能支持这个理论。如果我将文本更改为"1. የእንግሊዝ ፕሪምየር ሊግ ነህሴ 6 ይጀምራል።",它会正确检测。

这里发生了什么?

+0

示例代码使用String.getBytes()。这取决于“平台默认编码”。我看不到应该是哪种编码。你最好在这个字符集中构造一个包含所有允许字符的字符串GSM_0338,并且对于你的SMS文本中的每个字符,检查它是否包含在这个字符串中。对于检查,我没有看到从SMS文本创建字节的必要性。 –

+0

@RalfKleberhoff这有帮助。谢谢 –

+0

为什么不只是'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/)。 –

回答

0

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别的东西了。奇迹般有效。

相关问题