您是否注意到每个人写电话号码的方式都不同?有些人使用空格,有些人使用破折号,有些人使用括号。不同的人会将不同数量的数字组合在一起。
当您尝试将电话号码存储在数据库中并需要通过电话号码检索记录时,这会成为一个真正的问题。
直接跳至:
- 什么是规范 化电话号码?
- 电话号码格式混乱
- 这为什么是一个问题?
- 如何规范化电话号码
- 通过用户界面
- 处理现有数据
- 删除一些非数字字符
- 确定国家代码
- 仅保留数字和 + 号
- 电话号码哲学
- 最后的想法
什么是规范化电话号码?
在 IT 和计算机科学中,规范化意味着使某事物保持一致或标准化。规范化 阿富汗电话号码数据 是所有记录中格式一致的电话号码。
电话号码有国际标准吗?
E.164标准定义了国际公共电信编号方案。如果我们想以标准化的方式存储电话号码,就应该使用 E.164 格式。
还有另一项标准侧重于人类可读的格式。 国际电信联盟 (ITU)发布了E.123标准,该标准定义了电话号码、电子邮件地址和网址的标准符号。
以 E.123 格式书写的国际电话号码如下所示:
相同的电话号码采用 E.164 格式如下所示:
但当被要求在表单字段中输入电话号码时,大多数人会按照当地惯例或个人偏好来填写。而这些在各个国家甚至个人之间都可能存在很大差异。
电话号码格式混乱
例如,在美国,人们会这样写他们的电话号码
这为什么是一个问题?
当您将电话号码存储在数据库中时,您希望无论如何输入都可以搜索它们。
假设您的数据库中有以下电话号码:
如果您接到一个电话,您将如何在数据库中找到客户的详细信息?
如何规范化电话号码
存储电话号码最不明确的格式是 E.123 定义的国际格式,不带任何空格。
但是你怎样才能到达那里呢?
通过用户界面
最好的方法是首先尝试让您的用户以这种格式输入他们的电话号码。
这可以通过提供国家下拉列表,然后根据国家代码自动格式化电话号码来实现。
例如,国际电话输入库提供了这个漂亮的用户界面:
处理现有数据
如果您无法让用户以正确的格式输入他们的电话号码,因为您正在处理遗留数据或从其他来源导入数据,那么您的旅程将会更加困难 – 但并非不可能。
首先,考虑使用库。开源了一个名为 l的库,它可以在很多情况下为您提供帮助。
如果您使用 Python,请查看 的 端口,。
或者对于。
但有时您需要编写自己的规范化函数或处理库无法处理的特殊情况,因为它没有足够的上下文。
我将重点介绍绝大多数情况下,您面临的主要问题是 日营业时间的设置后点击屏幕应用我的 电话号码书写方式不一致。对于最奇怪的局部边缘情况,请查看本文末尾的电话号码哲学部分。
在大多数情况下,以下步骤应该可以帮你完成大部分任务:
删除一些非数字字符
第一步,请小心删除非数字字符。有些字符可以帮助您确定区号。
电话号码的书写方式可以提示国家和地区代码。例如,在美国,区号通常用括号括起来。
或者有时区号用空格或斜线分隔。
考虑这些结构,并保存您对国家或地区代码的初步猜测以供以后使用。
确定国家代码
如果您只处理来自一个国家的电话号码,您可以假设所有电话号码要么已经具有格式为 或 的国家代码+1
,要么它们是本地号码。
人们可能还会输入不带+
符号的国家代码,例如1
或39
。
如果本地号码以单个 开头0
,则在几乎所有国家/地区,您都可以(并且必须)删除0
并在前面添加国家/地区代码。但是在意大利, 即使从国外拨打国家/地区代码,号码前面的 0 也必须保留。
如果用户输入的号码以 开头00
,则删除00
,但假定国家代码已经存在。请注意某些国家的特殊情况。例如,在澳大利亚或香港,00xx
用于选择拨打国际电话时使用的运营商。
但大多数情况下:
如果您要处理来自多个国家的电话号码,则需要知道用户在输入电话号码时假设的是哪个国家。
如果您很幸运,只需要处理几个国家,那么区号可以为您提供有关该国家/地区的提示:某些区号在一个国家/地区使用,但在其他国家/地区不使用。
仅保留数字和 + 号
最后一步,删除除+
开头的符号之外的所有非数字字符。
您最终规范化的电话号码应如下所示:
现在您就可以将其存储为字符串了。
当您必须搜索电话号码时,请以相同的方式规范化搜索词并进行搜索。
为了安全起见,请同时存储原始电话号码。稍后您可能需要它来进行验证或向用户显示。
电话号码哲学
我必须承认:我把事情说得比实际情况更直白。虽然本文的其余部分应该涵盖了 加拿大电子邮件线索 你遇到的大多数情况,但现实情况要复杂得多。
为了更深入地探讨这个主题,我建议阅读文章《 程序员相信的有关电话号码的错误信息》 ,它是 libphonenumber 存储库的一部分。
以下是一些最重要的方面,如果你不小心,它们可能会给你带来麻烦:
- 电话号码并不总是唯一的:人们可以拥有多个电话号码,一个电话号码可以由许多人共享。
- 电话号码可以更改:人们可以更改他们的电话号码,并且可以重新分配电话号码。
- 并非所有号码都可以拨打或发送短信
- 非 ASCII 字符:例如,在埃及,阿拉伯文字通常用于书写电话号码。
- 编号计划变更:各国可以变更其编号计划,并且可能存在两种格式都有效的过渡期。
- 电话号码不是数字:电话号码在数学意义上不是数字。
7
与 不同007
,并且有些国家/地区*5770
是可拨打的电话号码(例如以色列铁路)。
最后的想法
仅按输入时的样子存储电话号码几乎可以保证您以后很难找到它们。如果您希望以后能够搜索电话号码,尽早规范化电话号码是一个好主意。
这里再提醒一下这篇文章的重点:
- 首先尝试从用户那里获取标准化的数字。
- 向用户显示标准化的数字并要求他们确认。
- 一些非数字字符可以为您提供有关国家/地区代码的提示。
- 尝试猜测国家代码时请注意当地的惯例。
- 不要简单地删除所有非数字字符并将其存储为数字。
- 将电话号码以规范化格式存储为字符串,并保留原始格式。