PHP - fgetcsv y acentos

   
Vista:
Imágen de perfil de isai

fgetcsv y acentos

Publicado por isai (37 intervenciones) el 26/03/2013 19:10:12
Hola,

Estoy leyendo un archivo CSV con fgetcsv, sin embargo presento que al iniciar una cadena despues de la coma existe un caracter con acento. Ejemplo:

1,df-782,Árbol de levas, 1252.60

Bien esta linea al ser leida queda:

Array
(
[0] => 1
[1] => df-782
[2] => rbol de levas
[3] => 1252.60
)

Me puedes orientar de como puedo solucionar este problema.

El archivo se genera con Excel de tipo CSV.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

fgetcsv y acentos

Publicado por xve (5522 intervenciones) el 26/03/2013 22:02:19
Prueba a utilizar la función utf8_encode() o utf8_decode() al guardar los valores o al mostrarlos...

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isai

fgetcsv y acentos

Publicado por Isai (37 intervenciones) el 27/03/2013 01:09:48
xve,

Pero eso lo ocupo al leer el CSV o como le indico a Excel la codificación es utf8?

saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

fgetcsv y acentos

Publicado por xve (5522 intervenciones) el 27/03/2013 07:41:28
Como lees los valores del svn? nos puedes mostrar el código?

También puedes utilizar utf8_encode() a la hora de mostrar los datos... algo así:
1
echo utf8_encode($variable);


Si nos muestras como lo haces, intento aplicarlo a tu código ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isai

fgetcsv y acentos

Publicado por Isai (37 intervenciones) el 27/03/2013 18:58:27
Claro te pongo el código que uso para leer el archivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$file = $_FILES['archivo']['tmp_name'];
$handle = fopen($file,"r");
 
while(($fileop = fgetcsv($handle,10000,',','"')) !== false){
	#-- Celdas en el archivo
	$codigo = $fileop[0];	//Codigo 
	$proceso = $fileop[1];	//Proceso
	$nomAbr = $fileop[2];	//Nombre abreviado
	$nomCom = $fileop[3];	//Nombre completo
	$precio = $fileop[4];	//Precio
	$metodo = $fileop[5];	//Método
	$depto = $fileop[6];	//Departamento
	$etiqueta = $fileop[7];	//Etiqueta	
	$material = $fileop[8];	//Material
	$prescrip = $fileop[9];	//Prescripción
	$entrega = $fileop[10];	//Entrega
}


Desde aqui me quita el caracter acentuado como te lo puse en el ejemplo anterior
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

fgetcsv y acentos

Publicado por xve (5522 intervenciones) el 27/03/2013 19:07:46
Isai, seria algo así:
1
2
3
$codigo = utf8_encode($fileop[0]);
$proceso = utf8_encode($fileop[1]);
....

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isai

fgetcsv y acentos

Publicado por Isai (37 intervenciones) el 27/03/2013 19:15:16
No, no funciono te pongo mi salida
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Array
(
    [0] => 50009
    [1] => SR
    [2] => AVAL
    [3] => CIDO VALPROICO
    [4] => 245
    [5] => IAM
    [6] => R
    [7] => Tubo Oro
    [8] => Suero 2mL refrig. estable 7 días
    [9] => Ayuno mín.4h
    [10] => 6
)
 
//Deberia de ser.
 
Array
(
    [0] => 50009
    [1] => SR
    [2] => AVAL
    [3] => ÁCIDO VALPROICO
    [4] => 245
    [5] => IAM
    [6] => R
    [7] => Tubo Oro
    [8] => Suero 2mL refrig. estable 7 días
    [9] => Ayuno mín.4h
    [10] => 6
)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

fgetcsv y acentos

Publicado por xve (5522 intervenciones) el 27/03/2013 19:31:30
Pero en cambio, al acento de la palabra días y mín si que aparece...

Que raro... voy a ver si consigo simular el mismo problema y te comento, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

fgetcsv y acentos

Publicado por Iván (9 intervenciones) el 28/03/2013 10:11:46
El problema se debe a la codificación de caracteres, algo que suele "escapársenos" al trabajar con textos.

Tienes varias alternativas para solventar el problema, pero lo más eficiente es que siempre trabajes con codificación UTF-8. Para ello, tanto el fichero que contiene los datos como el que procesa la información (el fichero php) deben estar codificados en UTF8 sin BOM.

Así, lo más sencillo es que abras el CSV con un editor que te permita cambiar la codificación (como Notepad++ y ejecutes Formato > Convertir en UTF-8 sin BOM.

Por otro lado, aquí te dejo una guía de buenas prácticas para programar en PHP.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isai

fgetcsv y acentos

Publicado por Isai (37 intervenciones) el 01/04/2013 19:14:05
Hola Iván,

He echo lo que me has recomendado y sigo con el mismo problema. Ya guardando el documento codificado como UTF-8 sin BOM y definiendo el charset en php.

Espero me puedan ayudar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

fgetcsv y acentos

Publicado por Iván (9 intervenciones) el 03/04/2013 22:31:13
Hola, isai

¿el archivo PHP donde procesas el csv está también codificado como UTF8?

Si hay más archivos involucrados (esto es, si al archivo que procesa el csv se le está llamando vía include o require, también tienen que estar codificados en UTF8 sin BOM.

Otra cuestión.. si partes del csv del csv original, no hay codificarlo sino convertirlo a UTF8. Si directamente lo codificas, perderás los caracteres que no sean ascii. Si abres el archivo que has codificado/convertido, ¿ves bien los acentos?

Lo último que puedes probar es utilizar iconv, aunque pueda funcionar no te lo recomiendo porque la cuestión es trabajar bien y entender la codificación de caracteres.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

fgetcsv y acentos

Publicado por Cesar (1 intervención) el 13/08/2015 18:21:02
Muchas gracias por la observación, me sirvió de mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

fgetcsv y acentos

Publicado por Sergi (1 intervención) el 31/12/2013 16:48:36
Prueba a poner :

1
setlocale(LC_ALL, 'es_ES.UTF8');

antes del fgetcsv.

En mi caso ha funcionado. Obtenia LVAREZ en lugar de ÁLVAREZ (por ejemplo). Mi código es este :

1
2
3
4
5
6
7
$arxiu_handle = fopen($Arxiu_csv, 'r');
$linies = 0 ;
		while (!feof($arxiu_handle) ) {
				setlocale(LC_ALL, 'ca_ES.UTF8');
				$linies_del_csv[] = fgetcsv($arxiu_handle, 2048, ';');
				$linies = $linies + 1 ;
		}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

fgetcsv y acentos

Publicado por Marco (1 intervención) el 21/01/2015 20:53:23
Muy tarde pues, pero hasta ahora empece a trabajar con cvs y pues mi problema era al momento de guardar el archivo como .cvs , lo hacia para DOS y luego solo delimiatado por comas, y listo aunque resalto que todos mis paginas php llevan encabezados utf8 para evitarme clavos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar