top of page

Teléfonos

Estandarización de números

Estandarización de números telefónicos

Estandarización de números telefónicos

La estandarización de números telefónicos es un componente crítico del data cleansing, especialmente cuando se trabaja con datos internacionales. Te explicaré los aspectos más importantes de este proceso.

Estándares y normas internacionales

  1. Recomendación UIT-T E.164: Es el estándar internacional principal para la numeración telefónica. Especifica:Longitud máxima de 15 dígitos (incluido el código de país)
    Formato general: [+][código de país][número nacional]
    Sin espacios, guiones u otros separadores en la representación canónica

  2. Recomendación UIT-T E.123: Establece pautas para la presentación visual de números telefónicos:Uso del signo "+" para indicar el prefijo internacional
    Espacios para mejorar la legibilidad (aunque en bases de datos se almacenan sin espacios)
    Ejemplo: +34 91 123 4567

  3. ISO 3166-1: Define los códigos de país (utilizados como base para los códigos telefónicos)

Mejores prácticas actuales

1. Almacenamiento:

  • Guardar siempre en formato E.164 completo

  • Mantener el campo como cadena de texto (no como número) para preservar ceros iniciales

  • Considerar campos separados para componentes (código país, área, número)

2. Procesamiento:

  • Utilizar bibliotecas especializadas como libphonenumber (Google)

  • Implementar validaciones regulares de la integridad de los datos

  • Mantener actualizadas las reglas nacionales (cambian con el tiempo)

3. Presentación al usuario:

  • Mostrar en formato local cuando se conoce el contexto

  • Usar formato internacional completo para comunicaciones globales

  • Ofrecer opciones de formato según el contexto de uso

4. Gestión de excepciones:

  • Establecer protocolos para números especiales (emergencias, servicios)

  • Documentar tratamiento de extensiones internas

  • Definir procedimientos para números imposibles de normalizar

Consideraciones específicas por región

  • América del Norte: Sistema de numeración uniforme (NANP) con código +1 y formato XXX-XXX-XXXX

  • Europa: Diversos sistemas nacionales con diferentes longitudes

  • Asia: Gran variabilidad en formatos y reglas nacionales

  • Latinoamérica: Diferentes longitudes y sistemas de marcación

Herramientas recomendadas

  1. Google libphonenumber: Biblioteca de referencia para validación y formateo

  2. PhoneNumberKit: Para ecosistema Apple

  3. Twilio Lookup API: Validación y enriquecimiento de números

  4. NumVerify: API de validación internacional

La estandarización de números telefónicos es un proceso complejo que requiere atención al detalle y conocimiento de las normas internacionales, pero implementado correctamente, elimina redundancias, facilita la comunicación y mejora significativamente la calidad de los datos de contacto.


Recomendación UIT-T E.164

La Recomendación UIT-T E.164 es el estándar internacional definido por la Unión Internacional de Telecomunicaciones - Sector de Normalización de las Telecomunicaciones (UIT-T) para la numeración telefónica. Su principal propósito es garantizar que los números de teléfono sean únicos y puedan ser utilizados globalmente en redes públicas y privadas de telecomunicaciones.

Contenido de la Recomendación E.164

La norma establece las reglas para la estructuración y el uso de los números telefónicos a nivel mundial. Sus principales aspectos incluyen:

  1. Longitud máxima: Un número de teléfono internacional no puede exceder los 15 dígitos (sin contar los prefijos de marcación internacional, como el +).

  2. Estructura del número:
    Código de país (CC - Country Code): De 1 a 3 dígitos. Identifica a cada nación o región (Ej.: +1 para EE. UU. y Canadá, +54 para Argentina).
    Código de área/local (NDC - National Destination Code): Opcional, dependiendo del país. Puede representar ciudades o regiones específicas dentro de un país.
    Número de suscriptor (SN - Subscriber Number): Número único asignado a cada usuario dentro del área correspondiente.

  3. Formato de marcación: Debe ser compatible con distintos sistemas de telecomunicaciones, asegurando la interoperabilidad entre redes.

  4. Asignación de números: Cada país regula la distribución de los números dentro de su territorio.

  5. Números especiales: Incluye reglas para numeración de servicios de emergencia, telecomunicaciones satelitales y números especiales de tarifa premium.

Respeto por la norma

La mayoría de los países siguen la norma E.164 porque es esencial para la interoperabilidad de las telecomunicaciones a nivel global. Sin embargo, hay algunas variaciones en la forma en que la aplican:

  • Algunos países han mantenido estructuras de numeración antiguas, adaptando solo ciertos aspectos de la E.164.

  • Otros tienen excepciones internas, como el uso de números más cortos para llamadas nacionales o servicios especiales.

En general, para llamadas internacionales, todos los países deben ajustarse a la E.164 para asegurar la comunicación entre redes de distintas naciones.

Proceso de estandarización de números 

1. Recopilación y análisis inicial

  • Identificación de fuentes: Determinar de dónde provienen los números (formularios web, CRM, importaciones masivas)

  • Catalogación por país: Clasificar preliminarmente según país de origen si es posible

  • Análisis de patrones: Identificar formatos comunes y anomalías en los datos

2. Limpieza básica (pre-procesamiento)

  • Eliminación de caracteres no numéricos: Quitar espacios, guiones, paréntesis, puntos

  • Eliminación de prefijos de marcación: Quitar secuencias como "00" o "011" (prefijos internacionales)

  • Tratamiento de extensiones: Separar y almacenar aparte secuencias como "ext.", "x", "#"

3. Normalización estructural

  • Identificación del país: Determinar el código de país (si no está presente)

  • Aplicación de reglas nacionales: Adaptar según normativa específica de cada país

  • Conversión a formato E.164: Transformar a formato [+][código país][número nacional]

  • Eliminación de prefijos nacionales redundantes: Quitar prefijos como el "0" inicial en Europa

4. Validación

  • Verificación de longitud: Comprobar que se cumplen los requisitos de longitud del país

  • Validación de códigos de área: Verificar si los códigos de área/región son válidos

  • Comprobación de asignación: Validar si el rango numérico está asignado (cuando sea posible)

  • Detección de números especiales: Identificar números de servicios o emergencias

5. Enriquecimiento (opcional)

  • Geolocalización: Añadir información sobre localidad/región

  • Tipo de línea: Determinar si es móvil, fijo, VoIP, etc.

  • Operador: Identificar el proveedor de servicio

  • Zona horaria: Asociar con zona horaria correspondiente

Implementación con herramientas

Google libphonenumber

Esta biblioteca de código abierto desarrollada por Google es el estándar de facto para el procesamiento de números telefónicos.

Ejemplo de implementación en Python:

import phonenumbers
from phonenumbers import geocoder, carrier, timezone

def estandarizar_numero(numero_entrada, pais_default=None):
   try:
       # Si el número no tiene código de país, asumimos uno por defecto
       if not numero_entrada.startswith('+') and pais_default:
           numero_parsed = phonenumbers.parse(numero_entrada, pais_default)
       else:
           numero_parsed = phonenumbers.parse(numero_entrada)
       
       # Verificar si el número es válido
       if not phonenumbers.is_valid_number(numero_parsed):
           return {
               "status": "invalid",
               "message": "Número no válido según las reglas del país"
           }
       
       # Convertir al formato E.164
       numero_e164 = phonenumbers.format_number(numero_parsed,
                                            phonenumbers.PhoneNumberFormat.E164)
       
       # Formato internacional para visualización
       numero_internacional = phonenumbers.format_number(numero_parsed,
                                                    phonenumbers.PhoneNumberFormat.INTERNATIONAL)
       
       # Formato nacional para visualización local
       numero_nacional = phonenumbers.format_number(numero_parsed,
                                               phonenumbers.PhoneNumberFormat.NATIONAL)
       
       # Información adicional
       resultado = {
           "status": "valid",
           "e164": numero_e164,
           "international": numero_internacional,
           "national": numero_nacional,
           "country_code": numero_parsed.country_code,
           "country": geocoder.description_for_number(numero_parsed, "es"),
           "type": "móvil" if numero_parsed.number_type == phonenumbers.PhoneNumberType.MOBILE else "fijo"
       }
       
       # Información del operador (solo disponible para algunos países)
       operador = carrier.name_for_number(numero_parsed, "es")
       if operador:
           resultado["carrier"] = operador
           
       # Zona horaria asociada
       zonas_horarias = timezone.time_zones_for_number(numero_parsed)
       if zonas_horarias:
           resultado["timezone"] = zonas_horarias
           
       return resultado
       
   except Exception as e:
       return {
           "status": "error",
           "message": str(e)
       }

NumVerify API

Esta API REST permite validar y obtener información sobre números telefónicos.

import requests

def verificar_numero(numero, api_key):
   # Asegurarse de que el número no tenga el signo +
   if numero.startswith('+'):
       numero = numero[1:]
   
   url = f"http://apilayer.net/api/validate?access_key={api_key}&number={numero}"
   
   try:
       response = requests.get(url)
       data = response.json()
       
       if data.get("valid"):
           return {
               "status": "valid",
               "e164": "+" + data.get("international_format").replace(" ", ""),
               "international": data.get("international_format"),
               "national": data.get("local_format"),
               "country_code": data.get("country_prefix"),
               "country": data.get("country_name"),
               "type": data.get("line_type"),
               "carrier": data.get("carrier"),
               "location": data.get("location")
           }
       else:
           return {
               "status": "invalid",
               "message": "Número no válido"
           }
   except Exception as e:
       return {
           "status": "error",
           "message": str(e)
       }

Ejemplos prácticos por país

1. Estados Unidos

Características del sistema NANP (North American Numbering Plan):

  • Código de país: +1

  • Estructura: NXX-NXX-XXXX (donde N=2-9, X=0-9)

  • 10 dígitos (sin código de país)

Ejemplos de estandarización:

Entrada                Resultado E.164  Formato internac.     Formato nacional

(212) 555-1234           +12125551234              +1 212 555 1234                 (212) 555-1234   

646.555.4321             +16465554321             +1 646 555 4321                (646) 555-4321   

1-800-123-4567        +18001234567            +1 800 123 4567               (800) 123-4567

Procesamiento con libphonenumber:

numero_usa = estandarizar_numero("(212) 555-1234", "US")
# Resultado:
# {
#   "status": "valid",
#   "e164": "+12125551234",
#   "international": "+1 212 555 1234",
#   "national": "(212) 555-1234",
#   "country_code": 1,
#   "country": "Estados Unidos",
#   "type": "fijo",
#   "timezone": ["America/New_York"]
# }

2. España

Características:

  • Código de país: +34

  • Estructura: 9 dígitos después del código de país

  • Móviles: comienzan con 6 o 7

  • Fijos: comienzan con 8 o 9

Ejemplos de estandarización:

Entrada              Resultado E.164  Formato internacional Formato nacional     

91 123 45 67            +34911234567             +34 911 23 45 67                    911 23 45 67   

600.12.34.56            +34600123456            +34 600 12 34 56                  600 12 34 56   

0034 922 123 456   +34922123456             +34 922 12 34 56                  922 12 34 56

Procesamiento con libphonenumber:

numero_espana = estandarizar_numero("91 123 45 67", "ES")

# Resultado:
# {
#   "status": "valid",
#   "e164": "+34911234567",
#   "international": "+34 911 23 45 67",
#   "national": "911 23 45 67",
#   "country_code": 34,
#   "country": "España",
#   "type": "fijo",
#   "carrier": "Movistar",
#   "timezone": ["Europe/Madrid"]
# }

3. Argentina

Características:

  • Código de país: +54

  • Estructura compleja con códigos de área de longitud variable

  • Prefijo "0" para llamadas nacionales

  • Prefijo "15" para móviles locales

Ejemplos de estandarización:

Entrada                      Resultado E.164     Formato internacional   Formato nacional     

(011) 4123-4567                 +541141234567              +54 11 4123-4567                     011 4123-4567   

0351 15-678-9012            +5435167890123           +54 351 678-9012                    0351 15-678-9012   

+54 9 223 456-7890         +5492234567890          +54 9 223 456-7890                0223 15-456-7890

Procesamiento con libphonenumber:

numero_argentina = estandarizar_numero("011 4123-4567", "AR")

# Resultado:
# {
#   "status": "valid",
#   "e164": "+541141234567",
#   "international": "+54 11 4123-4567",
#   "national": "011 4123-4567",
#   "country_code": 54,
#   "country": "Argentina",
#   "type": "fijo",
#   "timezone": ["America/Argentina/Buenos_Aires"]
# }

Consideraciones avanzadas

  1. Números móviles en Argentina: El sistema argentino utiliza el prefijo "9" en formato internacional para móviles, pero "15" en formato nacional, lo que añade complejidad.

  2. Cambios en numeración: Los planes de numeración nacionales cambian periódicamente. Por ejemplo, España añadió un dígito a sus números fijos en 1998.

  3. Formateo contextual: El formato de presentación debe adaptarse según el contexto:Para usuarios locales: formato nacional
    Para comunicaciones internacionales: formato E.164 o internacional

  4. Almacenamiento óptimo: Siempre almacenar en formato E.164 canónico (+CCNNNNN...)

  5. Gestión de errores: Implementar una estrategia para números no verificables (guardar en formato original pero marcados como no verificados)

El proceso de estandarización de números telefónicos requiere una combinación de reglas generales y excepciones específicas por país, por lo que utilizar bibliotecas como libphonenumber simplifica enormemente esta tarea y reduce los errores.


bottom of page