PHP - Mostrar ñ y tildes en php

 
Vista:
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Marcial (5 intervenciones) el 24/11/2020 17:44:20
Buen dia... tengo una funcion que lista directorios en un tree view. Tengo una funcion para subir archivos a esos directorios que estan en un servidor. Al subir un archivo con ñ por ejemplo: Albañil lo sube bien al servidor sin problemas pero no se me ve en mi sistema web a la hora de cargarlo en el tree view, aca les dejo la funcion..si me pudieran ayudar gracias de antemano.

Utilizo una expresion regular la cual creo esta correcta.

1
2
3
4
5
6
protected function path($id) {
    $id = str_replace('/', DIRECTORY_SEPARATOR, $id);
    $id = trim($id, DIRECTORY_SEPARATOR);
    $id = $this->real($this->base . DIRECTORY_SEPARATOR . $id);
    return $id;
}

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
public function lst($id, $with_root = false) {
    $dir = $this->path($id);
    $lst = @scandir($dir);
 
    if(!$lst) { throw new Exception('Could not list path: ' . $dir); }
    $res = array();
    foreach($lst as $item) {
 
        if($item == '.' || $item == '..' || $item === null) { continue; }
        $tmp = preg_match('([^ a-z -я-_0-9.]+)ui', $item);
 
 
        if($tmp === false || $tmp === 1) { continue; }
        if(is_dir($dir . DIRECTORY_SEPARATOR . $item)) {
 
            $res[] =array('text' => $item, 'children' => true,  'id' => $this->id($dir . DIRECTORY_SEPARATOR . $item), 'icon' => 'folder') ;
 
        }
        else {
            $res[] = array('text' => $item, 'children' => false, 'id' => $this->id($dir . DIRECTORY_SEPARATOR . $item), 'type' => 'file', 'icon' => 'file file-'.substr($item, strrpos($item,'.') + 1));
 
        }
    }
    if($with_root && $this->id($dir) === '/') {
 
        $res = array(array('text' => basename($this->base), 'children' => $res, 'id' => '/', 'icon'=>'folder', 'state' => array('opened' => true, 'disabled' => true)));
    }
    return $res;
}
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 joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por joel (1269 intervenciones) el 24/11/2020 19:15:45
Hola Marcial, es un tanto extraño...

si haces un
1
print_r($lst);
que te devuelve?
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
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Marcial (5 intervenciones) el 25/11/2020 14:43:56
Buen dia.. ante todo gracias por tomarse su tiempo para responder... cuando le hago un var_dump($lst) si me muestra en el directorio el archivo con la ñ o tilde. ej: mío.txt, lo muestra pero la í con un rombito negro, como un caracter extraño entiende. Antes de subir el archivo al server con la funcion move_upload_file, le hago un utf8_decode al archivo, ahi lo sube bien al server tanto con ñ como con tilde, pero el lio es ahi como le comente, al tratar de mostrarlo en el tree view con la funcion esa.

Saludos y gracias de antemano
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 Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Yoel (198 intervenciones) el 25/11/2020 23:51:09
Hola Marcial, primero no es muy conveniente escribir los nombre de los ficheros con ñ y acentos para usarlo a travez del navegado. El problema que estas teniendo es el problema de cotejamiento de caracteres, es posible que en tu html tengas iso-8859-1 o latin1 y tu servidor tenga definido otro como utf8. Una solución a este problema, es que tengas el mismo en los dos lugares. En el phpinfo() de tu servidor puedes ver que juego de caracteres tiene tu servidor php,
1
default_charset
al igual que en tu html
1
<meta http-equiv="Content-Type" content="text/html" charset="utf-8">
si en ambos caso te coincide no debes tener problema. Otra solución sería, que en el momento que vas a mostrar los nombres de tu fichero a travez del navegador usar los métodos utf8_decode() o utf8_encode().

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
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Marcial (5 intervenciones) el 26/11/2020 16:15:30
Buen dia Yoel gracias por responder. Esto de veras me va a volver loco. Ahora por un lado subo bien mi fichero con ñ o tilde a una ruta X en el server, y por otro lado no me lo muestra en el tree view... y lo q me dice de la configuracion utf8 esta bien.. aca le dejo el cod...

Este es el cod que uso para subir archivos a traves de un boton al server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
foreach ($_FILES as $key) //Iteramos el arreglo de archivos
{
    if ($key['error'] == UPLOAD_ERR_OK)//Si el archivo se paso correctamente Ccontinuamos
    {
        $NombreOriginal =utf8_decode($key['name']);//Obtenemos el nombre original del archivo
        //$f=iconv("UTF-8", "ISO-8859-1",$NombreOriginal);
        $temporal = utf8_decode($key['tmp_name']); //Obtenemos la ruta Original del archivo
 
        $Destino = $rutaseleccionada . $NombreOriginal;    //Creamos una ruta de destino con la variable ruta y el nombre original del archivo
 
        move_uploaded_file( $temporal, $Destino); //Movemos el archivo temporal a la ruta especificada
    }
 
    if ($key['error'] == '') //Si no existio ningun error, retornamos un mensaje por cada archivo subido
    {
        $mensage .= '-> Archivo <b>' . $NombreOriginal . '</b> Subido correctamente. <br>';
    }
    if ($key['error'] != '')//Si existio algún error retornamos un el error por cada archivo.
    {
        $mensage .= '-> No se pudo subir el archivo <b>' . $NombreOriginal . '</b> debido al siguiente Error: n' . $key['error'];
    }
 
}
Vea que tiene un utf8_decode, y por ahi comentariado esta un iconv, los dos me funcionan bien para guardar el archivo con tilde o ñ en el server.. el problema esta a la hora de listarlo en el tree view...

Aca esta el cod del tree view, que se genera a partir de un evento onclick ... este es desde php...


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class fs
{
	protected $base = null;
 
 
	protected function id($path) {
		$path = $this->real($path);
		$path = substr($path, strlen($this->base));
		$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
		$path = trim($path, '/');
		return strlen($path) ? $path : '/';
	}
 
 
 
	public function __construct($base) {
		$this->base = $this->real($base);
		if(!$this->base) { throw new Exception('Base directory does not exist'); }
	}
	public function lst($id, $with_root = false) {
		$dir = $this->path($id);
		$lst = @scandir($dir);
/
		if(!$lst) { throw new Exception('Could not list path: ' . $dir); }
		$res = array();
		foreach($lst as $item) {
 
			if($item == '.' || $item == '..' || $item === null) { continue; }
			$tmp = preg_match('([^ a-z -я-_0-9.]+)ui', $item);
 
 
			if($tmp === false || $tmp === 1) { continue; }
			if(is_dir($dir . DIRECTORY_SEPARATOR . $item)) {
 
				$res[] =array('text' => $item, 'children' => true,  'id' => $this->id($dir . DIRECTORY_SEPARATOR . $item), 'icon' => 'folder') ;
 
			}
			else {
				$res[] = array('text' => $item, 'children' => false, 'id' => $this->id($dir . DIRECTORY_SEPARATOR . $item), 'type' => 'file', 'icon' => 'file file-'.substr($item, strrpos($item,'.') + 1));
 
			}
		}
		if($with_root && $this->id($dir) === '/') {
 
			$res = array(array('text' => basename($this->base), 'children' => $res, 'id' => '/', 'icon'=>'folder', 'state' => array('opened' => true, 'disabled' => true)));
		}
		return $res;
	}
 
 
if(isset($_GET['operation'])) {
 
	#$fs = new fs(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'root' . DIRECTORY_SEPARATOR);
	$fs = new fs($directorio);
//	obtener_estructura_directorios($fs);
	try {
		$rslt = null;
		switch($_GET['operation']) {
			case 'get_node':
 
				$node = isset($_GET['id']) && $_GET['id'] !== '#' ? $_GET['id'] : '/';
				$rslt = $fs->lst($node, (isset($_GET['id']) && $_GET['id'] === '#'));
				break;
 
		}
		header('Content-Type: application/json; charset=UTF-8');
 
		echo json_encode($rslt);
	}
	catch (Exception $e) {
		header($_SERVER["SERVER_PROTOCOL"] . ' 500 Server Error');
		header('Status:  500 Server Error');
		echo $e->getMessage();
	}
	die();
}
Creo que la cosa esta aca
1
2
3
header('Content-Type: application/json; charset=UTF-8');
 
echo json_encode($rslt);

pero he probado de todo y nada...

si pudiera chequear... gracias de antemano
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 Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Yoel (198 intervenciones) el 26/11/2020 16:36:32
Hola, una pregunta tu no estas usando código html para tree view, lo estas colocando todo directo en la página. En la explicación que te doy hay una que es en el código html, si lo estas usando por favor ponlo para ver como estas definiendo la codificación. Lo otro que tienes que ver es si tu script tiene la misma codificación eso lo puedes ver en tu ide en las propiedades del script.

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
sin imagen de perfil
Val: 11
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Marcial (5 intervenciones) el 26/11/2020 16:48:07
Si, si uso un HTML disculpa. Este es el HTML

1
2
3
4
5
6
7
8
9
10
11
<div id="vsolicitud"    style="cursor:move;position:absolute;padding-left: 4px;width:65%;height:570px;top:36%;left:16%;display:none;background-color:rgb(199, 193, 193);color:#252831;overflow:visible;border-radius:10px;border:solid 2px white;">
    <a href="javascript:void()" title="Close" class="tools" style="float:right;width:1.2em;height:1.3em;padding:0px;margin:2px;text-align:center;" onclick="location.reload()">X</a>
    <br>
    <strong><label>RUTA:</label></strong><input id="camino_solicitud" name="cs" class="form-control" style="width:600px;" /><br><br>
    <br><br>
    <div id="content_usuario_solicitud" hidden style="display:none"><label>Usuario:</label><input id="usuario_solicitud" /><br><br></div>
    <div>
        <div id="tree_proyects_solicitud" class=".jstree" style="width:500px !important;height:400px !important;">
        </div>
</div>
</div>

Esta es la funcion js que uso con un evento onclick

1
2
3
4
5
6
var vsol=document.getElementById('vsolicitud');
var ctu=document.getElementById('content_usuario_solicitud');
 
vsol.style.display='block';
ctu.style.display='block';
fn_tree('tree_proyects_solicitud','php/tree_directorio.php?operation=get_node',"camino_solicitud");

Y esta es la fcion fn_tree

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
function fn_tree (id,backend,camino) {
	$('#'+id)
		.jstree({
			'core' : {
				'data' : {
					'url' : backend,
					'data' : function (node) {
						return { 'id' : node.id };
					}
				},
				'check_callback' : function(o, n, p, i, m) {
					if(m && m.dnd && m.pos !== 'i') { return false; }
					if(o === "move_node" || o === "copy_node") {
						if(this.get_node(n).parent === this.get_node(p).id) { return false; }
					}
					return true;
				},
				'themes' : {
					'responsive' : false,
					'variant' : 'small',
					'stripes' : true
				}
			},
			'sort' : function(a, b) {
				return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : (this.get_type(a) >= this.get_type(b) ? 1 : -1);
			},
			'contextmenu' : {
				'items' : function(node) {
					var tmp = $.jstree.defaults.contextmenu.items();
					delete tmp.create;
					delete tmp.rename;
					delete tmp.remove;
					delete tmp.ccp;
					tmp.solicitar = {
						label:"",
						action: function (data){
							var inst = $.jstree.reference(data.reference),
								obj = inst.get_node(data.reference);
							camino.value=obj.id;
							console.log(obj.id);
						}
					};
					/*tmp.create.label = "New";
					tmp.create.submenu = {
						"create_folder" : {
							"separator_after"	: true,
							"label"				: "Folder",
							"action"			: function (data) {
								var inst = $.jstree.reference(data.reference),
									obj = inst.get_node(data.reference);
								inst.create_node(obj, { type : "default", text : "New folder" }, "last", function (new_node) {
									setTimeout(function () { inst.edit(new_node); },0);
								});
							}
						},
						"create_file" : {
							"label"				: "File",
							"action"			: function (data) {
								var inst = $.jstree.reference(data.reference),
									obj = inst.get_node(data.reference);
								inst.create_node(obj, { type : "file", text : "New file" }, "last", function (new_node) {
									setTimeout(function () { inst.edit(new_node); },0);
								});
							}
						}
					};*/
					if(this.get_type(node) === "file") {
						delete tmp.create;
					}
					return tmp;
				}
			},
			'types' : {
				'default' : { 'icon' : 'folder' },
				'file' : { 'valid_children' : [], 'icon' : 'file' }
			},
			'plugins' : ['state','dnd','sort','types','contextmenu','unique']
		})
		.on('changed.jstree', function (e, data) {console.log(data.selected);
			if(data && data.selected && data.selected.length) {
				var obj = data.instance.get_node(data.selected);
				if(camino)
 
					document.getElementById(camino).value=obj.id;
				/*$.get('?operation=get_content&id=' + data.selected.join(':'), function (d) {
					if(d && typeof d.type !== 'undefined') {
						$('#data .content').hide();
						switch(d.type) {
							case 'text':
							case 'txt':
							case 'md':
							case 'htaccess':
							case 'log':
							case 'sql':
							case 'php':
							case 'js':
							case 'json':
							case 'css':
							case 'html':
								$('#data .code').show();
								$('#code').val(d.content);
								break;
							case 'png':
							case 'jpg':
							case 'jpeg':
							case 'bmp':
							case 'gif':
								$('#data .image img').one('load', function () { $(this).css({'marginTop':'-' + $(this).height()/2 + 'px','marginLeft':'-' + $(this).width()/2 + 'px'}); }).attr('src',d.content);
								$('#data .image').show();
								break;
							default:
								$('#data .default').html(d.content).show();
								break;
						}
					}
				});*/
			}
			else {
				//$('#data .content').hide();
				//$('#data .default').html('Select a file from the tree.').show();
			}
		});
}
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 Yoel
Val: 617
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Mostrar ñ y tildes en php

Publicado por Yoel (198 intervenciones) el 26/11/2020 18:18:21
Hola y gracias por responder por favor, solo me estas colocando el body pero la codificación se define en la cabecera y esa no la estas colocando ejemplo:

1
2
3
4
5
<!DOCTYPE html>
<html lang="es">
<head>
	<meta charset="utf-8" />
</head>

Nota: esto es para html5 .
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

Mostrar ñ y tildes en php

Publicado por Marcial (5 intervenciones) el 26/11/2020 22:31:17
Buenas tardes...si, si tengo ese puesto en la página Index que es la única página q maneja HTML...todo lo demás lo hago con Ajax y js
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