venerdì 14 giugno 2019

SMARTFORMS problema con caratteri cinesi.

Si presenta uno strano problema su uno SMARTFORMS con una stringa molto lunga che inizia con caratteri cinesi.

Si deve riportare in stampa un lungo elenco di matricole (numero identificativo degli imballi) separate da spazi, il tutto contenuto in una unica stringa.

Da notare che, come riportato nella nota 485296, Smartforms ha alcune limitazioni:

In Smart Forms, the output length for string fields is restricted to a maximum of 255 characters.


Nel nostro caso la stringa può essere più lunga di 255 caratteri, pertanto si usa questo trucchetto per portarla in stampa:


cioè si separa la stringa in pezzi lunghi 250 caratteri, poi ci pensa lo SMARTFORMS ad andare a capo correttamente.

Se però la stringa inizia con caratteri cinesi allora la stampa risulta errata: ad un certo punto inizia a stampare una matricola ma si interrompe per poi ripeterla correttamente nella successiva:


questo invece come viene la stampa se si tolgono i caratteri cinesi:


Chiaramente la stringa risulta correttamente compilata:

包裝標記/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 18059257 18059258 18059259 18059260 18059261 18059262 18059263 18059264 18059265 18059266 18059267 18059268 18059269 18059270 18059271 18059482  

per cui deve essere un errore nel modo di trattare le stringhe con caratteri particolari.

Ho fatto vari tentativi:

  • ho provato prima a compilare la stringa con l'elenco degli imballi, poi ad aggiungere (all'inizio) la stringa di caratteri.
  • ho provato a togliere uno per volta i caratteri cinesi, pensando che magari fosse un problema legato ad un singolo carattere.
  • ho provato ad usare solo caratteri cinesi.
  • ho provato a usare altri caratteri cinesi (cinese semplificato/tradizionale)

ma il problema rimane lo stesso.

Ho fatto la prova usando anche caratteri giapponesi (santo "google traslator"!) e, anche in questo caso, il comportamento è anomalo:


Stringa:

パッケージマーケティング/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 18059257 18059258 18059259 18059260 18059261 18059262 18059263 18059264 18059265 18059266 18059267 18059268 18059269 18059270 18059271 18059482                                                         

Mi sembra di capire che il problema accade se la successiva matricola da stampare è intorno (o contiene) alla colonna 250, potrebbe essere un errore legato alla lunghezza dei caratteri cinesi nel sistema UNICODE, dove i caratteri occupano un numero variabile di byte (fino a 4 byte).

Ad ogni modo non ho trovato altra soluzione che separare le 2 stringhe in modo che quella con i caratteri cinesi sia corta.

Questo il risultato finale:


Per cercare di capire dove sta effettivamente il problema ho scritto un piccolo ABAP che lavora su 2 stringhe, una che inizia con caratteri cinesi e la seconda solo con caratteri occidentali:

DATA: wa_stringa1(80),
      wa_stringa2(80),
      wa_stringa3(80).

wa_stringa1 = '12345678901234567890'.
wa_stringa2 = '包裝345678901234567890'.

WRITE: /.

WRITE: / 'Stringa 1       =' , wa_stringa1.
WRITE: / 'Stringa 2       =' , wa_stringa2.

WRITE: /.

wa_stringa3 = wa_stringa1+0(10).

WRITE: / 'Stringa 1+0(10) =' , wa_stringa3.

wa_stringa3 = wa_stringa2+0(10).

WRITE: / 'Stringa 2+0(10) =' , wa_stringa3.

WRITE: /.

questo il risultato di output:

Stringa 1       = 12345678901234567890
Stringa 2       = 包裝345678901234567890

Stringa 1+0(10) = 1234567890
Stringa 2+0(10) = 包裝34567890

Pensavo che magari il problema fosse relativo ad un errato modo di considerare la lunghezza dei caratteri cinesi (mi aspettavo un output tipo Stringa 2+0(10) = 包裝345678), invece non è così e la lunghezza iniziale è conteggiata in modo corretto.

Mentre se si lavora con stringhe lunghe:

DATA: w_a(1000),
      w_b(1000).

CONCATENATE '包裝標記/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 '
            '18059257 18059258 18059259 18059260 18059261 18059262 01123456 02123456 03123456 04123456 05123456 06123456 07123456 08123456 09123456 10123456'
       INTO w_a RESPECTING BLANKS.

CONCATENATE '1234/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 '
            '18059257 18059258 18059259 18059260 18059261 18059262 01123456 02123456 03123456 04123456 05123456 06123456 07123456 08123456 09123456 10123456'
       INTO w_b RESPECTING BLANKS.

WRITE: / 'w_a +0(250)  =' , w_a+0(250).
WRITE: / 'w_b +0(250)  =' , w_b+0(250).

WRITE: /.

WRITE: / 'w_a +0(10)   =' , w_a+0(10).
WRITE: / 'w_b +0(10)   =' , w_b+0(10).

WRITE: /.

WRITE: / 'w_a +240(20) =' , w_a+240(20).
WRITE: / 'w_b +240(20) =' , w_b+240(20).

WRITE: /.

WRITE: / 'w_a +240(20) =' , w_a+240(20).
WRITE: / 'w_b +240(20) =' , w_b+240(20).

WRITE: /.

L'output è il seguente:

w_a +0(250)  = 包裝標記/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 18059257 18059258 18059259 18059260 18059261 18059262 011234>
w_b +0(250)  = 1234/PACKAGES MARKING: 18059236 18059238 18059239 18059240 18059241 18059242 18059243 18059244 18059245 18059246 18059247 18059248 18059249 18059252 18059253 18059254 18059255 18059256 18059257 18059258 18059259 18059260 18059261 18059262 01123456 02

w_a +0(10)   = 包裝標記/>
w_b +0(10)   = 1234/PACKA

w_a +240(20) = 1123456 02123456 031
w_b +240(20) = 1123456 02123456 031

Quindi, lavorando con stringhe che contengono caratteri speciali unicode, il comportamento è:

  1. normale se si lavora sui primi caratteri con una stringa corta.
  2. errato se si lavora sui primi caratteri con una stringa lunga, nel mio caso più di 250 caratteri.
  3. normale se si lavora su una parte di stringa che esclude i primi caratteri anche su una stringa lunga.

Ho anche trovato questo interessante articolo: Unicode in 5 minuti.

Nessun commento:

Posta un commento