FoxPro/Visual FoxPro - XML - Caracteres especiales

 
Vista:

XML - Caracteres especiales

Publicado por Eduardo Decunto (2 intervenciones) el 20/08/2018 14:24:38
Hola amigos del Foro, estoy generando un archivo XML y txt.
El problema es que cuando algún campo de la tabla contiene algún caracter especial ("ñ"; "ú"; "&"; etc), el XML se corta, cosa que no pasa con el TXT

El prg arranca así

TEXT TO cXml1 NOSHOW TEXT PRETEXT 7

<?xml version="1.0" encoding="utf-8" ?>


Espero vuestra ayuda y desde ya muchísimas gracias desde Rosario - Argentina

Eduardo Decunto
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
sin imagen de perfil
Val: 62
Ha aumentado su posición en 2 puestos en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

XML - Caracteres especiales

Publicado por jose casalino (129 intervenciones) el 20/08/2018 20:17:28
Buenas

prueba con esto para ver sui te sirve, yo louso para la eliminar eso del xml de la factura electronica.

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
FUNCTION caracterespecial
PARAMETER xcadena
xaliasanterr33 = ALIAS()
IF  .NOT. USED('caracteres')
     DO xcaracteresv1
ENDIF
SELECT caracteres
SCAN FOR ok = 0 .OR.  .NOT. EMPTY(lh)
     IF LIKE("*" + ld + "*", xcadena)
          xcadena = (reemplazacadena(xcadena, ld, ALLTRIM(lh)))
     ENDIF
ENDSCAN
SELECT (xaliasanterr33)
RETURN (xcadena)
ENDFUNC
 
 
PROCEDURE xcaracteresv1
CREATE CURSOR caracteres (ld C (1), nd N (3), lh C (1), nh N (3), ok N (1), r N (1))
FOR c = 1 TO 255
     APPEND BLANK
     REPLACE ld WITH CHR(c)
     REPLACE nd WITH c
ENDFOR
REPLACE lh WITH 'a' ALL FOR ld = '@'
REPLACE lh WITH 'y' ALL FOR ld = '&'
REPLACE lh WITH 'a' ALL FOR ld = 'á'
REPLACE lh WITH 'e' ALL FOR ld = 'é'
REPLACE lh WITH 'i' ALL FOR ld = 'í'
REPLACE lh WITH 'o' ALL FOR ld = 'ó'
REPLACE lh WITH 'u' ALL FOR ld = 'ú'
REPLACE lh WITH 'a' ALL FOR ld = 'à'
REPLACE lh WITH 'e' ALL FOR ld = 'è'
REPLACE lh WITH 'i' ALL FOR ld = 'ë'
REPLACE lh WITH 'o' ALL FOR ld = 'n'
REPLACE lh WITH 'u' ALL FOR ld = 'ù'
REPLACE lh WITH 'a' ALL FOR ld = 'ä'
REPLACE lh WITH 'e' ALL FOR ld = 'ë'
REPLACE lh WITH 'i' ALL FOR ld = 'ï'
REPLACE lh WITH 'o' ALL FOR ld = 'ö'
REPLACE lh WITH 'u' ALL FOR ld = 'ü'
REPLACE lh WITH 'a' ALL FOR ld = 'â'
REPLACE lh WITH 'e' ALL FOR ld = 'ê'
REPLACE lh WITH 'i' ALL FOR ld = 'î'
REPLACE lh WITH 'o' ALL FOR ld = 'ô'
REPLACE lh WITH 'u' ALL FOR ld = 'û'
REPLACE lh WITH 'A' ALL FOR ld = 'Á'
REPLACE lh WITH 'E' ALL FOR ld = 'É'
REPLACE lh WITH 'I' ALL FOR ld = 'Í'
REPLACE lh WITH 'O' ALL FOR ld = 'Ó'
REPLACE lh WITH 'U' ALL FOR ld = 'Ú'
REPLACE lh WITH 'A' ALL FOR ld = 'À'
REPLACE lh WITH 'E' ALL FOR ld = 'È'
REPLACE lh WITH 'I' ALL FOR ld = 'Ì'
REPLACE lh WITH 'O' ALL FOR ld = 'Ò'
REPLACE lh WITH 'U' ALL FOR ld = 'Ù'
REPLACE lh WITH 'A' ALL FOR ld = 'Ä'
REPLACE lh WITH 'E' ALL FOR ld = 'Ë'
REPLACE lh WITH 'I' ALL FOR ld = 'Ï'
REPLACE lh WITH 'O' ALL FOR ld = 'Ö'
REPLACE lh WITH 'U' ALL FOR ld = 'Ü'
REPLACE lh WITH 'A' ALL FOR ld = 'Â'
REPLACE lh WITH 'E' ALL FOR ld = 'Ê'
REPLACE lh WITH 'I' ALL FOR ld = 'Î'
REPLACE lh WITH 'O' ALL FOR ld = 'Ô'
REPLACE lh WITH 'U' ALL FOR ld = 'Û'
REPLACE lh WITH 'n' ALL FOR ld = 'n'
REPLACE lh WITH 'N' ALL FOR ld = 'Ñ'
REPLACE nh WITH ASC(lh) ALL FOR  .NOT. EMPTY(lh)
REPLACE r WITH 1 ALL FOR  .NOT. EMPTY(nh)
REPLACE ok WITH 1 ALL FOR ld = ' '
REPLACE ok WITH 1 ALL FOR ld = '_'
REPLACE ok WITH 1 ALL FOR nd = 47
REPLACE ok WITH 1 ALL FOR nd >= 39 .AND. nd <= 90
REPLACE ok WITH 1 ALL FOR nd >= 97 .AND. nd <= 122
REPLACE ok WITH 1 ALL FOR  .NOT. EMPTY(nh)
REPLACE lh WITH '.' ALL FOR ok = 0 .AND. EMPTY(lh)
RETURN
 
**
PROCEDURE reemplazacadena
PARAMETER xtcadena, xpalabrai,  ;
          xpalabraf
IF LEN(xpalabraf) > 1
     xpalabrai = UPPER(xpalabrai)
     xpalabraf = UPPER(xpalabraf)
     xtcadena = UPPER(xtcadena)
ENDIF
xtcadena = (xtcadena)
xpalabrai = (xpalabrai)
xpalabraf = (xpalabraf)
xlpalabrai = LEN(xpalabrai)
xi = 1
textofinal = ''
ss = 0
FOR cssss = 1 TO LEN(xtcadena)
     IF SUBSTR((xtcadena), cssss,  ;
        (xlpalabrai)) =  ;
        (xpalabrai)
          xsubstrae = SUBSTR(xtcadena,  ;
                      cssss,  ;
                      xlpalabrai)
          xtcadenalf = LEFT(xtcadena,  ;
                       cssss -  ;
                       1)
          textofinal = textofinal +  ;
                       xpalabraf
          cssss = cssss +  ;
                  LEN(xpalabrai) -  ;
                  1
     ELSE
          textofinal = textofinal +  ;
                       SUBSTR(xtcadena,  ;
                       cssss, 1)
     ENDIF
ENDFOR
RETURN (textofinal)
ENDPROC
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 Johnn Gutierrez

Caracteres especiales

Publicado por Johnn Gutierrez (1 intervención) el 03/04/2020 19:09:53
Es mas eficiente trabajar con el comando STRCONV para corregir la cadena,
*!* STRCONV("",9) ->Converts double-byte characters in cExpression to UTF-8


Aún usando el comando STRCONV si estas trabajando con servidores remotos por ODBC sera necesarios hacer unos ajustes adicionales.

1
2
SQLEXEC(conn,"SET CHARACTER SET utf8")
SQLEXEC(conn,"SET COLLATION_CONNECTION='utf8_general_ci'")


La conbinación funciona perfecto.

igual en tu caso puedes usar:
1
2
3
TEXT TO cXml1 NOSHOW TEXT PRETEXT 7
ENDTEXT
cXml1=STRCONV(cXml1,9)
y listo!!!.
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 Fernando D.
Val: 13
Ha disminuido su posición en 8 puestos en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

XML - Caracteres especiales

Publicado por Fernando D. (15 intervenciones) el 22/08/2018 13:11:25
Hola Eduardo:

La codificación de caracteres es un tema muy importante de manejar bien, ya que no se soluciona con una simple sustitución de caracteres, sino que afecta a toda la codificación interna de los mismos.

Te dejo un artículo muy bueno sobre el tema:
https://www.w3.org/International/articles/definitions-characters/index.es

La forma correcta de manejarlo es tener presente el origen de cómo se crea la cadena y si se requiere aplicar alguna conversión que maneje esa codificación, dependiendo del formato destino.

Si la codificación requerida de destino es "UTF-8", no alcanza con solo poner una leyenda que diga "encoding=UTF-8", porque es como si a una manzana se le cambia la etiqueta para que ahora diga que es una uva.

Visual FoxPro trabaja por defecto con cadenas (Strings) en formato ANSI, y para transformar esa codificación en UTF-8 hay que aplicar una función de conversión, que en VFP es STRCONV(), que como verás en la ayuda, permite varios tipos de conversión.

En tu caso, luego de esto:

1
2
3
4
TEXT TO cXml1 NOSHOW TEXT PRETEXT 1+2+4
   <?xml version="1.0" encoding="utf-8" ?>
   ...
ENDTEXT

y una vez que tengas la cadena finalizada y no tengas que modificarla más, hay que realizar la conversión:

cXML2 = STRCONV(cXML1, 9)

y cXML2 ya contendrá la cadena correctamente codificada y lista para usarse o guardarse.

Es importante controlar de dónde se recupera la cadena y dónde se envía, ya que en el caso de que la cadena transformada se guarde codificada en una tabla o archivo, luego no hay que volver a realizar esa codificación, porque muy probablemente se corromperá su codificación y quedará en estado ilegible.

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

XML - Caracteres especiales

Publicado por Hércules Palacios (1 intervención) el 30/08/2018 07:02:41
Estimados TODOS.

Tengo un problema similar estoy por cambiar de PAC y en las pruebas, me entregan el XML timbrado pero con caracteres especiales que no me había dado cuenta... hasta que intente abrirlo desde iExplorer.. (yo les entrego el XML para que lo timbren codificado en UTF-8, es decir sin estos caracteres especiales..)

Ejem. como les entrego: <?xml version="1.0" encoding="utf-8">

Ejem. como me lo entrega el PAC: &lt;?xml version="1.0" encoding="utf-8"?&gt;

Hice una prueba reemplazando manualmente los caracteres especiales desde el BlockNotas...

&lt; por <

&gt; por >

Lo guarde y SI.. al parecer todo bien...

Ahora.. estoy indagando integrar a mi programa en VFP9.0 para que actualice el XMLtimbrado que me entrega el PAC..

Tendrán un ejemplo... (estoy utilizando el componente Chilkat y parte del código que HalconDivino compartio.. )

Muchas gracias... de antemano...

Saludos cordiales.

Hércules Palacios M.
(intervenciones anteriores como: HerPalMI)
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