关于验证:使用Java将电话号码转换为国际格式(E.164)的最佳方法是什么? 您所在的位置:网站首页 外交部英语怎么翻译 关于验证:使用Java将电话号码转换为国际格式(E.164)的最佳方法是什么?

关于验证:使用Java将电话号码转换为国际格式(E.164)的最佳方法是什么?

2024-05-02 14:41| 来源: 网络整理| 查看: 265

使用Java将电话号码转换为国际格式(E.164)的最佳方法是什么?

给出一个\\'电话号码\\'和一个国家/地区ID(例如ISO国家/地区代码),我想将其转换为标准的E.164国际格式电话号码。

我敢肯定我可以很容易地手工完成它-但是我不确定它在所有情况下都能正常工作。

您会建议使用哪个Java框架/库/实用程序来完成此任务?

P.S。"电话号码"可以是普通大众可以识别的任何东西,例如

123* (510) 786-0404 * 1-800-GOT-MILK * +44-(0)800-7310658

最后一个是我的最爱-这是有人在英国写他们的电话号码的方式,这意味着您应该使用44或使用0。

E.164格式编号应为全数字,并使用完整的国际国家/地区代码(例如44)

相关讨论 看看这个网站:droidprism.blogspot.com/2013/06/…

Google提供了一个用于处理电话号码的库。他们用于Android

的同一个

http://code.google.com/p/libphonenumber/

1234567891011121314String swissNumberStr ="044 668 18 00" PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try {   PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr,"CH"); } catch (NumberParseException e) {   System.err.println("NumberParseException was thrown:" + e.toString()); } // Produces"+41 44 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL)); // Produces"044 668 18 00" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL)); // Produces"+41446681800" System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164)); 相关讨论 谢谢。这看起来很有希望。我会尝试的 图书馆看起来不错。阻止我在Web应用程序中使用它的唯一原因是JavaScript文件大小:-( 新网址是opensource.google/projects/libphonenumber 有没有一种使用库将纯数字文本转换为1-647-288-4782的方法?国家/地区代码后有一个连字符。谢谢。

从编写此类内容的经验来看,要实现100%的可靠性确实很困难。我已经编写了一些Java代码来执行此操作,该代码在处理我们拥有的数据方面相当不错,但不会在每个国家/地区都适用。您需要提出的问题是:

国家之间的字符到数字的映射是否一致?美国使用了大量此类武器(例如1800-GOT-MILK),但在澳大利亚,这是非常罕见的。您需要做的是确保您对相关国家/地区进行了正确的映射(如果可能有所不同)(可能没有)。我不知道使用不同字母的国家(例如俄罗斯的西里尔字母和前东区国家)会做什么;

您必须接受您的解决方案将不会是100%,并且您不应期望它是100%。您需要采用"最佳猜测"方法。例如,没有真正的方法可以知道132345是澳大利亚的有效电话号码,如1300 123 456一样,但是这是用于13xx号码的仅有的两种模式,并且不能从海外拨打;

您还必须询问是否要验证区域(区域代码)。我相信美国使用的系统中,区号的第二位数字是1或0。这可能曾经是这种情况,但我不确定是否仍然适用。无论如何,许多其他国家将有其他规则。在澳大利亚,固定电话和移动(手机)电话的有效区号是两位数字(第一个是0)。 08、03和04均有效。 01不是。您如何满足呢?您要吗?

国家/地区使用不同的约定,无论它们写多少位数。您必须决定是否要接受"规范"之外的其他内容。这些在澳大利亚都很常见:

(02)1234 5678 02 1234 5678 0411 123 123(但我从未见过04 1112 3456) 131123 13 1123 131123 1300123123 1300 123 123 02-1234-5678 1300-234-234 44 78 1234 1234 44(0)78 1234 1234 44-78-1234-1234 44-(0)78-1234-1234 0011 44?? 78 1234 1234(0011是标准的国际拨号代码) (44)078 1234 1234(不常见)

那就是我的头顶。对于一个国家。例如,在法国,通常以数字对的形式写入电话号码(12 34 56 78),然后他们也以这种方式发音:而不是:

un(一个),deux(两个),trois(三个),...

十二球(十二),特伦特(十三),...

您想迎合这种文化差异吗?我不认为,但是如果您将规则设置得过于严格,这个问题值得考虑。

也有些人可能在电话号码上附加分机号码,可能带有" ext "或类似的缩写。您要满足此要求吗?

对不起,这里没有代码。只是要问自己的问题和要考虑的问题的列表。正如其他人所说,一系列正则表达式可以完成上述操作,但是最终,电话号码字段最终还是(大部分)自由格式的文本。

相关讨论 字符到数字的映射在每个被广泛使用的国家/地区都是一致的(或说明相同:在没有一致的映射的国家/地区,电话号码将不表示为字母)。由于可以使用国家/地区代码,因此您也可以确定需要哪些映射。 优秀的职位。顺便说一句,我们墨西哥人也将电话号码成对分组(并发音)。至少对我来说,只记住4个个人号码而不是8个容易记住(我倾向于使用英语电话号码)。 如果您拨打电话。不。 formatter从java.text.Format扩展而来,您将能够优雅地处理语言环境。

这是我的解决方案:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960public static String FixPhoneNumber(Context ctx, String rawNumber) {     String      fixedNumber ="";     // get current location iso code     TelephonyManager    telMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);     String              curLocale = telMgr.getNetworkCountryIso().toUpperCase();     PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();     Phonenumber.PhoneNumber     phoneNumberProto;     // gets the international dialling code for our current location     String              curDCode = String.format("%d", phoneUtil.getCountryCodeForRegion(curLocale));     String              ourDCode ="";     if(rawNumber.indexOf("+") == 0)     {         int     bIndex = rawNumber.indexOf("(");         int     hIndex = rawNumber.indexOf("-");         int     eIndex = rawNumber.indexOf("");         if(bIndex != -1)         {             ourDCode = rawNumber.substring(1, bIndex);         }         else if(hIndex != -1)         {                           ourDCode = rawNumber.substring(1, hIndex);         }         else if(eIndex != -1)         {             ourDCode = rawNumber.substring(1, eIndex);         }         else         {             ourDCode = curDCode;         }               }     else     {         ourDCode = curDCode;     }     try     {       phoneNumberProto = phoneUtil.parse(rawNumber, curLocale);     }     catch (NumberParseException e)     {       return rawNumber;     }     if(curDCode.compareTo(ourDCode) == 0)         fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.NATIONAL);     else         fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.INTERNATIONAL);     return fixedNumber.replace("",""); }

我希望这对遇到相同问题的人有所帮助。

享受并自由使用。

说实话,听起来您已经涵盖了大多数基础。

在英国有时(不正确地)使用的44(0)800格式很烦人,并且根据E.123(这是ITU-T建议如何显示数字的严格要求)并不是严格有效。如果您没有E.123的副本,那么值得一看。

就其价值而言,电话网络本身并不总是使用E.164。 PBX生成的ISDN信令中(或者如果您使用蒸汽电话,则在网络中)通常会出现一个标志,该标志告诉网络所拨打的号码是本地,国内还是国际电话。

感谢您的回答。如原始问题所述,我对将号码格式化为标准格式的兴趣要比确定其是否为有效电话号码(如真实电话号码)的兴趣大得多。

我目前有一些手工编写的代码,其中包含电话号码字符串(由用户输入)以及源国家/地区上下文和目标国家/地区上下文(拨打电话的国家/地区以及拨打电话的国家/地区)正在拨号-这是系统已知的),然后在步骤

中进行以下转换

从数字中去除所有空格

将所有字母转换为数字-使用字母到数字的查找表(例如,A-> 2,B-> 2,C-> 2,D-> 3)等操作键盘(I不知道某些键盘的分配方式不同)

剥离所有标点符号-如果存在前一个\\'\\',则保持原样(如果该数字已经采用某种国际格式)。

确定该号码是否具有用于国家/地区上下文的国际拨号前缀-例如如果源上下文是英国,那么我会看看它是否以\\ '00 \\'开头-并将其替换为\\'\\'。我目前不检查\\ 00后面的数字是否跟目标国家/地区的国际拨号代码相同。我在查找表中查找来源国家/地区的国际拨号前缀(例如GB-> \\'00 \\',US-> \\'011 \\'等)

确定该号码是否具有国家/地区上下文的本地拨号前缀-例如如果源上下文是英国,那么我想看看它是否以\\'0 \\'开头-并以\\'\\'替换,后跟目标国家/地区的国际拨号代码。我在查找表中查找源国家/地区的本地拨号前缀(例如,GB-> \\'0 \\',US-> \\'1 \\'等),并在以下位置查找目标国家/地区的国际拨号代码另一个查询表(例如\\'GB \\'= \\'44 \\',US = \\'1 \\')

这似乎可以解决我到目前为止提出的所有问题-除了44(0)1234-567-890的情况以外-我将为此添加一个特殊情况检查。

写起来并不难-我可以为遇到的每个奇怪异常添加特殊情况。但是我真的很想知道是否有一个标准的解决方案。

电话公司似乎每天都在处理这件事。使用PSTN拨号时,我永远不会得到不一致的结果。例如,在美国(移动电话具有与座机相同的区号,我可以拨打1-123-456-7890或011-1-123-456-7890(其中011是美国的国际拨号前缀)和1是美国的国际拨号代码),1-123-456-7890(其中1是美国的本地拨号前缀)甚至是456-7890(假设我当时在123区号中)和每次都得到相同的结果。我假设内部将这些拨打的号码转换为相同的E.164标准格式,并且所有转换都是在软件中完成的。

相关讨论 在第5步中可能存在缺陷。在世界上某个地方可能存在电话号码,其中区号可以以与国家拨号前缀相同的数字开头(注意,我不知道是否有,但是我不知道)知道也没有),因此您不知道要删除前缀还是要删除区号的一部分。 (这不是英国或美国号码的问题)

我不知道可用于将电话号码格式化为E.164的标准库或框架。

用于我们产品的解决方案要求将提供的主叫方ID的PBX格式化为E.164,该解决方案是为所有适用国家/地区部署一个包含E.164格式信息的文件(数据库表)。 这样做的好处是可以在不更改生产代码库的情况下更新应用程序(以处理各种PSTN网络中所有奇怪的极端情况)。

该表包含每个国家/地区代码的行以及有关区号长度和订户长度的信息。一个国家可能有多个条目,具体取决于区号和订户号码长度可能有哪些变化。

使用新西兰PSTN(部分)拨号计划作为该表的示例。.

1234CC  AREA_CODE  AREA_CODE_LENGTH  SUBSCRIBER  SUBSCRIBER_LENGTH 64                            1              7 64         21                 2              7 64        275                 3              6

我们将执行与您所描述的类似的操作,即剥离提供的电话号码中的任何非数字字符,然后根据有关总体号码计划长度,外部访问代码和长途/国际访问代码的各种规则进行格式化。

相关讨论 怎么样:CC cc AREA_CODE aaREA_CODE_LENGTH n SUBSCRIBER什么是SUBSCRIBER_LENGTH 6或7。(我想我也看过7或8。) 缩短的列名是合理的,我纯粹出于说明性原因将表格式化为上述格式。我不清楚评论对订户和子长度tho意味着什么。

在某些国家/地区,您可以将112验证为有效的电话号码,但是如果在国家/地区代码前面加上国家/地区代码,则该国家/地区代码将不再有效。在其他国家/地区,您无法验证112,但可以将911验证为有效的电话号码。

我看过一些手机,其中Q键位于7键上,Z键位于9键上。我已经看到有些手机将Q和Z放在0键上,有些把Q和Z放在1键上。

昨天存在的区号今天可能不存在,反之亦然。

在北美的一半地区(国家代码1),区号的第二位数字规则以前为0或1,但该规则在10年前就消失了。

这是一项非常艰巨的任务,因为每个国家/地区的电话号码书写方式几乎都是不同的。

我们过去经常保留REGEXP(支持19种格式)的列表,以解析数字的3个部分,然后将这3个部分转换为" {1} {2} {3} "。

先对正则表达式进行更具体的排序,然后再进行解析成功的第一个。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有