当前位置:  开发笔记 > 编程语言 > 正文

PHP中的'可靠'SMS Unicode和GSM编码

如何解决《PHP中的'可靠'SMSUnicode和GSM编码》经验,为你挑选了2个好方法。

(稍微更新一下)

我不是很熟悉使用PHP的国际化,必须说,并且一些搜索并没有真正提供我正在寻找的答案.

我需要制定一种可靠的方法,只使用PHP将"相关"文本转换为Unicode以发送SMS消息(暂时,使用C#重写服务) - 显然,此时发送的消息将被发送作为纯文本.

我可以想象将所有内容转换为Unicode字符集(而不是使用标准的GSM字符集),但这意味着所有消息都将限制为70个字符(而不是160个字符).

所以,我想我真正的问题是:检测消息需要进行Unicode编码的最可靠方法什么,所以我只需要在绝对必要的 时候这样做(例如对于非拉丁语言字符)?

添加信息:

好吧,所以我早上都在为此工作,而且我还没有比我开始时更进一步(当然由于我在charset转换方面完全缺乏能力).所以这是修改后的场景:

我有来自外部源的文本SMS消息,这个外部源以纯文本+ Unicode斜线转义字符提供给我的响应.例如'显​​示'文字:

让我们来测试öäüéàèאיןתמיכהבעברית

返回:

让我们测试\ u00f6\u00e4\u00ec\u00e0\u00e8\u00f0\u00e0\u00e8\u05d0\u05d9\u05df\u05ea\u05de\u05d9\u05db\u05d4\u05d1\u05e2\u05d1\u05e8\u05d9\u05ea

现在,我可以用明文,GSM 03.38或Unicode发送给我的SMS提供商.显然,将上述内容作为明文发送会导致大量缺失的字符(它们被我的提供者替换为空格) - 我需要采用与内容有关的内容.我想要做的是以下内容:

    如果所有文本都在GSM 03.38代码页内,请按原样发送.(除了上面的希伯来字符以外,所有字符都适合此类别,但需要转换.)

    否则,将其转换为Unicode,并通过多条消息发送(因为对于SMS,Unicode限制为70字符而不是160字符).

正如我上面所说的那样,我很难用PHP做这件事(由于内置一些简单的转换函数,C#并不是什么大问题),但很可能我只是错过了明显的问题.我在PHP中找不到任何用于7位编码的预制转换类 - 我试图自己转换字符串并发送它似乎是徒劳的.

任何帮助将不胜感激.



1> 小智..:

在进入机制之前从概念上处理它,并且如果有任何明显的道歉,可以将字符串定义为Unicode字符序列,Unicode是一个数据库,它给出了一个id号,称为每个字符的代码点.需要合作.GSM-338包含Unicode字符的子集,因此您正在做的是从字符串中提取一组代码点,并检查该集合是否包含在GSM-338中.

// second column of http://unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT
$gsm338_codepoints = array(0x0040, 0x0000, ..., 0x00fc, 0x00e0)
$can_use_gsm338 = true;
foreach(codepoints($mystring) as $codepoint){
    if(!in_array($codepoint, $gsm338_codepoints)){
      $can_use_gsm338 = false;
      break;
    }
}

这留下了函数代码点($ string)的定义,它没有内置到PHP中.PHP将字符串理解为字节序列而不是Unicode字符序列.弥合差距的最好方法是尽可能快地将字符串转换为UTF8,并尽可能保持UTF8 - 在处理外部系统时必须使用其他编码,但将转换隔离到该系统的接口,仅在内部处理utf8.

您可以在http://hsivonen.iki.fi/php-utf8/找到在utf8中的php字符串和代码点序列之间转换所需的函数,这样就是你的codepoints()函数.

如果您从外部源获取数据,该数据为您提供Unicode斜杠转义字符("Let's test\u00f6\u00e4\u00fc ..."),则该字符串转义格式应转换为utf8.我不知道一个函数来做这个,如果找不到一个,这是字符串/正则表达式处理的问题+使用hsivonen.iki.fi函数,例如当你点击\ u00f6时,替换它与代码点0xf6的utf8表示.



2> jW...:

虽然这是一个老线程,我最近不得不解决一个非常类似的问题,并想发布我的答案.PHP代码有点简单.它从一个数组中精心设计的大量GSM有效字符代码开始,然后使用ord($ string)函数检查当前字符是否在该数组中,该函数返回传递的字符串的第一个字符的ascii值.这是我用来验证字符串是否值得GSM的代码.

    $valid_gsm_keycodes = Array(   
        0x0040, 0x0394, 0x0020, 0x0030, 0x00a1, 0x0050, 0x00bf, 0x0070,
        0x00a3, 0x005f, 0x0021, 0x0031, 0x0041, 0x0051, 0x0061, 0x0071,
        0x0024, 0x03a6, 0x0022, 0x0032, 0x0042, 0x0052, 0x0062, 0x0072,
        0x00a5, 0x0393, 0x0023, 0x0033, 0x0043, 0x0053, 0x0063, 0x0073,
        0x00e8, 0x039b, 0x00a4, 0x0034, 0x0035, 0x0044, 0x0054, 0x0064, 0x0074,
        0x00e9, 0x03a9, 0x0025, 0x0045, 0x0045, 0x0055, 0x0065, 0x0075,
        0x00f9, 0x03a0, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0076,
        0x00ec, 0x03a8, 0x0027, 0x0037, 0x0047, 0x0057, 0x0067, 0x0077, 
        0x00f2, 0x03a3, 0x0028, 0x0038, 0x0048, 0x0058, 0x0068, 0x0078,
        0x00c7, 0x0398, 0x0029, 0x0039, 0x0049, 0x0059, 0x0069, 0x0079,
        0x000a, 0x039e, 0x002a, 0x003a, 0x004a, 0x005a, 0x006a, 0x007a,
        0x00d8, 0x001b, 0x002b, 0x003b, 0x004b, 0x00c4, 0x006b, 0x00e4,
        0x00f8, 0x00c6, 0x002c, 0x003c, 0x004c, 0x00d6, 0x006c, 0x00f6,
        0x000d, 0x00e6, 0x002d, 0x003d, 0x004d, 0x00d1, 0x006d, 0x00f1,
        0x00c5, 0x00df, 0x002e, 0x003e, 0x004e, 0x00dc, 0x006e, 0x00fc,
        0x00e5, 0x00c9, 0x002f, 0x003f, 0x004f, 0x00a7, 0x006f, 0x00e0 );


        for($i = 0; $i < strlen($string); $i++) {
            if(!in_array($string[$i], $valid_gsm_keycodes)) return false;
        }

        return true;

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有