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

2022-09-01 07:23:29

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

给定一个“电话号码”和国家/地区ID(假设是ISO国家/地区代码),我想将其转换为标准的E.164国际格式电话号码。

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

您会推荐哪个Java框架/库/实用程序来实现此目的?

附言:“电话号码”可以是公众可以识别的任何东西 - 例如

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

最后一个是我最喜欢的 - 这是一些人在英国写他们的数字的方式,意味着你应该使用+44,或者你应该使用0。

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


答案 1

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

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

String 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));

答案 2

从编写此类内容的经验来看,要做到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)
  • 131 123
  • 13 1123
  • 131 123
  • 1 300 123 123
  • 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 (一), 双 (二), 三重奏 (三), ...

douze (十二), trente-quatre (三十四), ...

您想迎合这种程度的文化差异吗?我假设不是,但这个问题值得考虑,以防万一你把你的规则太严格了。

此外,有些人可能会在电话号码上附加分机号码,可能带有“ext”或类似的缩写。你想迎合这一点吗?

抱歉,这里没有代码。只是要问自己的问题和要考虑的问题的列表。正如其他人所说,一系列正则表达式可以完成上述大部分工作,但最终电话号码字段(大多数)在一天结束时是自由格式的文本。


推荐