Importación de datos CSV – una cuestión de caracteres

Para probar la importación de un archivo CSV, depende del juego de caracteres UTF-8 o ISO-8859-1 que se seleccione en la pantalla de importación de Prestashop.

Si intenta comenzar con un archivo de Excel con letras acentuadas, y guardado en formato CSV con separador “punto y coma”, podrá ver que las letras acentuadas se convierten en caracteres irreconocibles cuando se importan.

El problema es que con Excel, no se puede elegir el juego de caracteres.

Una solución es la dada por 6ma : a través de OpenOffice, que permite especificar la forma de guardar el archivo .csv en el momento de guardarlo.

Hemos probado guardar con formato ISO 8859-1, pero aún los mismos problemas. Por el contrario, todo fue bien guardando como UTF-8.

También es perfectamente posible codificar los caracteres en UTF-8 con Microsoft Excel. Basta con escribir una macro que realiza la codificación.

El ejemplo a continuación permite la codificación, decodificación y pruebas.

Del mismo modo, es fácil escribir otra macro que automáticamente generará formato CSV con la codificación que se quiera, directamente desde Excel.

Código:
‘ Char. number range | UTF-8 octet sequence
‘ (hexadecimal) | (binary)
‘ ——————–+———————————————
‘ 0000 0000-0000 007F | 0xxxxxxx

‘ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx

‘ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

‘ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Public Function Encode_UTF8(astr As String) As String

Dim c As Integer

Dim n As Integer

Dim utftext As String

utftext = ”  ”

n = 1

Do While n <= Len(astr)

c = AscW(Mid(astr, n, 1))

If c = 128) And (c = 2048) And (c = 65536

utftext = utftext + Chr(((c \ 262144) Or 240))

utftext = utftext + Chr(((((c \ 4096) And 63)) Or 128))

utftext = utftext + Chr((((c \ 64) And 63) Or 128))

utftext = utftext + Chr(((c And 63) Or 128))

End If

n = n + 1

Loop

Encode_UTF8 = utftext

End Function

‘ Char. number range | UTF-8 octet sequence

‘ (hexadecimal) | (binary)

‘ ——————–+———————————————

‘ 0000 0000-0000 007F | 0xxxxxxx

‘ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx

‘ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

‘ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Public Function Decode_UTF8(astr)

Dim c0, c1, c2, c3

Dim n

Dim unitext

If isUTF8(astr) = False Then

Decode_UTF8 = astr

Exit Function

End If

unitext = ”  ”

n = 1

Do While n <= Len(astr)

c0 = Asc(Mid(astr, n, 1))

If n <= Len(astr) – 1 Then

c1 = Asc(Mid(astr, n + 1, 1))

Else

c1 = 0

End If

If n <= Len(astr) – 2 Then

c2 = Asc(Mid(astr, n + 2, 1))

Else

c2 = 0

End If

If n <= Len(astr) – 3 Then

c3 = Asc(Mid(astr, n + 3, 1))

Else

c3 = 0

End If

If (c0 And 240) = 240 And (c1 And 128) = 128 And (c2 And 128) = 128 And (c3 And 128) = 128 Then

unitext = unitext + ChrW((c0 – 240) * 65536 + (c1 – 128) * 4096) + (c2 – 128) * 64 + (c3 – 128)

n = n + 4

ElseIf (c0 And 224) = 224 And (c1 And 128) = 128 And (c2 And 128) = 128 Then

unitext = unitext + ChrW((c0 – 224) * 4096 + (c1 – 128) * 64 + (c2 – 128))

n = n + 3

ElseIf (c0 And 192) = 192 And (c1 And 128) = 128 Then

unitext = unitext + ChrW((c0 – 192) * 64 + (c1 – 128))

n = n + 2

ElseIf (c0 And 128) = 128 Then

unitext = unitext + ChrW(c0 And 127)

n = n + 1

Else ‘ c0 < 128

unitext = unitext + ChrW(c0)

n = n + 1

End If

Loop

Decode_UTF8 = unitext

End Function

‘ Char. number range | UTF-8 octet sequence

‘ (hexadecimal) | (binary)

‘ ——————–+———————————————

‘ 0000 0000-0000 007F | 0xxxxxxx

‘ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx

‘ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

‘ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Public Function isUTF8(astr)

Dim c0, c1, c2, c3

Dim n

isUTF8 = True

n = 1

Do While n <= Len(astr)

c0 = Asc(Mid(astr, n, 1))

If n <= Len(astr) – 1 Then

c1 = Asc(Mid(astr, n + 1, 1))

Else

c1 = 0

End If

If n <= Len(astr) – 2 Then

c2 = Asc(Mid(astr, n + 2, 1))

Else

c2 = 0

End If

If n <= Len(astr) – 3 Then

c3 = Asc(Mid(astr, n + 3, 1))

Else

c3 = 0

End If

If (c0 And 240) = 240 Then

If (c1 And 128) = 128 And (c2 And 128) = 128 And (c3 And 128) = 128 Then

n = n + 4

Else

isUTF8 = False

Exit Function

End If

ElseIf (c0 And 224) = 224 Then

If (c1 And 128) = 128 And (c2 And 128) = 128 Then

n = n + 3

Else

isUTF8 = False

Exit Function

End If

ElseIf (c0 And 192) = 192 Then

If (c1 And 128) = 128 Then

n = n + 2

Else

isUTF8 = False

Exit Function

End If

ElseIf (c0 And 128) = 0 Then

n = n + 1

Else

isUTF8 = False

Exit Function

End If

Loop

End Function

Etiquetas: , , , ,

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: