Situación actual

Actualmente en la aplicación Censo, para validar un CURP de México, se sigue el siguiente algoritmo(pseudocódigo):

Funcion validarCURP(curp)
	
	// se convierte a mayúsculas y se eliminan espacios en blanco al inicio y al final del string recibido
	string curp := convertir_a_mayusculas(eliminar_espacios(curp))
 
	Si longitud(curp) != 18 Entonces
		
		regresa FALSO
 
	Si no Entonces
 
		// se calcula el digito verificador del curp
		integer digito := calculasDigitoVerificadorCURP(curp);

		// se obtiene el último digito del curp
		integer ultimoDigito := cortar_string(curp, -1)
        
		// expresión regular a evaluar, obtenido de RENAPO
        string patron = "/[A-Z]{4}\d{6}[HM][A-Z]{2}[B-DF-HJ-NP-TV-Z]{3}[A-Z0-9][0-9]/"

        Si !coincide(patron, curp) Entonces

      	    regresa FALSO

        Si no si !(digito = ultimoDigito) Entonces

        	regresa FALSO

        Si no Entonces 

    		regresa VERDADERO

        Fin Si		
	Fin Si
Fin Funcion


Para poder calcular el dígito verificador de un curp se utiliza el siguiente algoritmo(pseudocódigo).

Funcion calcularDigitoVerificadorCURP(curp)
 
	// se obtienen los primeros 17 caracteres del string recibido
	string segmentoRaiz := cortar_string($curp,17)
	// se el correspondiente valor en utf8 para cada letra del abecedario
	arreglo chrCaracter := decodificar_utf8("0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ")

    array intFactor := []
    float lngSuma := 0.0
	float lngDigito := 0.0

	// se recorren los strings de segmentoRaiz y chrCaracter
	Para i = 0 Hasta i = 16 Hacer
		string letraRaiz := cortar_string(segmentoRaiz, i, 1)
 			
		Para j = 0 Hasta j = 36 Hacer
			string letraChr := cortar_string(chrCaracter, j, 1)

			// cuando la letra de ambos strings coincide, se guarda la posición en la que coincidieron
			Si letraRaiz = letraChr Entonces
					intFactor[i] := j
			Fin Si
		Fin Para
	Fin Para
 
	Para k = 0 Hasta k = 16 Hacer
		
		// se realiza calculo para sumar los valores de las posiciones donde coincidieron las letras
		lngSuma := lngSuma + (intFactor[k] * (18 - k))
	
	Fin Para

	// se obtiene el modulo 10 de lngSuma y se le resta a 10
	lngDigito := 10 - (lngSuma modulo 10)

	Si lngDigito = 10 Entonces
	    lngDigito := 0
	Fin Si
    
	regresa lngDigito
Fin Funcion

 



En mayúsculas y sin espacios: AAPR630321HDFLRCC9