24

在你说这已经被问到之前,要知道我已经回顾了这些:


假设我正在开发一个必须处理电话号码的程序,并且我想确保它们以标准格式保存和显示,以便其他程序和人类也可以预测和一致地理解它们。

例如,我已经看到以下都是同一个美国电话号码的有效表示:

  • 1234567
  • 123-4567
  • 123 4567
  • 5551234567
  • (555) 1234567
  • 555-1234567
  • 555 123 4567
  • 555-123-4567
  • (555)-123-4567
  • (555) 123-4567
  • (5) 123 4567
  • 1-555-123-4567
  • (1) 555-123-4567
  • +1 555-123-4567
  • +1 555 123-4567
  • +1 (555) 123-4567
  • 恶心……</li>

然后不同的国家以不同的方式表示数字:

  • 55 1234 567 8901
  • 55 12 3456 7890
  • 55 123 456 7890
  • 55 1234 567890
  • 555 123 456
  • (55) 123 4567
  • 5.555.123-45-67
  • 恶心……</li>

如您所见,用户查看有效电话号码的方式几乎是无限的(英国电话号码的 Wikipedia 页面有 26 个打印机页面)。我希望我的数据库和屏幕上的所有数字都采用普遍可识别的格式。据我所知,ISO 和 ANSI 没有定义的格式。电话号码有标准符号吗?

4

2 回答 2

61

没有 ISO 标准,但有 ITU 标准。您需要 E.123 和 E.164。

总之,任何电话号码都由 +CC MMMMMM... 表示,其中 CC 是国家代码,是一到三位数字,而 MMMMMM... 是区号(如果适用)和用户号码。总位数不得超过 15。+ 表示“您当地的国际拨号前缀”。

我将使用我自己的固定电话号码举几个例子。

因此,例如,如果您在德国,号码 +44 2087712924 将拨打为 00442087712924,在美国您将拨打 011442087712924。44 表示它是英国号码,而 2087712924 是本地号码。

在实践中,一长串 MMMMM... 通常被分解成更小的部分,以便于阅读。你如何做到这一点因国家而异。我给出的例子通常写成 +44 20 8771 2924。

除了上面明确的 E.123 表示,您可以在世界上任何允许国际拨号的地方使用它,每个国家也有自己的本地数字表示方法,有些有几种。示例号码有时会写为 020 8771 2924 或 (020) 8771 2924。严格来说,前导 0 不是区号的一部分(即 20),而是向交易所发出的信号,意思是“这里有一个可以走出当地”。偶尔会省略区号,而将号码写成 8771 2924。所有这些本地表示都是模棱两可的,因为它们可能代表多个国家/地区的有效号码,甚至是同一国家/地区多个地区的有效号码。这意味着您应该始终存储带有国家代码的数字,最好将其存储在 E 中。123 符号。特别是您应该注意电话号码不是数字。像 05 这样的数字与 5 相同。电话号码 05 是5 不同,存储系统将从数字中去除前导零。将电话号码作为 CHAR 或 VARCHAR 存储在数据库中。

最后,一些奇怪的东西。示例号码将被一些愚蠢的人写为 0208 771 2924。这是可拨号的,但如果您去掉前导 0208 假设它是一个区号,那么其余部分作为本地号码无效。一些电话系统损坏的国家[怒视北美]的系统非常糟糕,在某些地方,您必须拨打所有 10 个数字才能拨打本地电话,有些地方您不能,有些地方您必须拨打 1NNN NNN NNNN,有些地方您必须拨打不能包括前导的,依此类推。在所有这些情况下,存储+CC MMMMM... 的数字是正确的。这取决于实际拨打电话(或他们的拨号软件)的人来弄清楚如何将其转换为他们特定位置的可拨号数字序列。

于 2014-01-08T16:59:31.690 回答
0

有很多当地的国家标准。在我的一个项目中,我遇到了同样的问题。解决为:

  1. 在数据库中存储为数字的所有内容:123456789
  2. 根据所选网页语言,此数字在页面加载时预先格式化。

例子:

  • 法国、卢森堡格式的电话号码,例如 12.34.56.78.90 或 12 34 56 78 90
  • 德国:123 45 67 或 123-45-67
  • 英国:020 1234 1234 或 1234 01234 12345
  • 意大利、荷兰:12 1234567 或 020-1234567
  • 独联体国家:123 123-45-67
于 2014-01-15T11:49:38.140 回答