Charset encoding/decoding error between DB2 and Nodejs

Asked

Viewed 90 times

1

My problem: I have a Node application that sends messages to a specific Whatsapp (works normally, without character error). But when performing a query in the database (IBM DB2) and send this data to the customer this symbol appears: . If I convert to utf-8 this appears: � . These symbols appear exactly where they should be and accented vowels.

To connect to the database I use the ibm_db package: https://www.npmjs.com/package/ibm_db

Testing:

(1) - I checked the database charset by charset-detector, that was the return:

  CharsetMatch {
    confidence: 15,
    charsetName: 'UTF-8',
    lang: undefined
  },
  CharsetMatch { confidence: 10, charsetName: 'Shift_JIS', lang: 'ja' },
  CharsetMatch { confidence: 10, charsetName: 'GB18030', lang: 'zh' },
  CharsetMatch { confidence: 10, charsetName: 'EUC-JP', lang: 'ja' },
  CharsetMatch { confidence: 10, charsetName: 'EUC-KR', lang: 'ko' },
  CharsetMatch { confidence: 10, charsetName: 'Big5', lang: 'zh' }
] ```

**(2)** - Tentei codificar e decodificar utilizando os pacotes:

**a)** utf8: 
 

    ```const utf8 = require('utf8')
    const convertUTF8 = (value) =>{
        value = value.toString()
        value =  utf8.encode(value)
        return utf8.decode(value)
    } // retorno � -> obs:tentei codificar e decodificar depois disso
    ```

**b)** Buffer nativo do Node:

    ```const convertUTF8 = (value) =>{
        value = value.toString()
        const buf = Buffer.from(value,'utf8')
        return buf
        
    } // retorno � obs:chutei -> Buffer.from(value,'latin1') também, mesmo erro. E também Buffer.from(value,'utf16le') sem sucesso
    ```

**c)** stringDecoder:

    ```const { StringDecoder } = require('string_decoder');
    const decoder = new StringDecoder('utf8');
    const convertUTF8 = (value) =>{
        value = value.toString()
        return decoder.end(value)   
    }// retorno �
    /*
    fiz também assim:
    
        const convertUTF8 = (value) =>{
            value = value.toString()
            const str = Buffer.from(value)
            console.log(decoder.end(str))
            return str
        
    } tive o mesmo erro
    */
    ```

**d)** Usei também o encov, mas não tenho o código para mostrar. Seu resultado foi igual aos outros

**NOTA:** *Se eu criar uma string e enviar como mensagem para o usuário ele recebe normalmente, então acredito que esse erro esteja acontecendo entre o db2 e o node.*

Então já não sei o que fazer, procurei por diversas soluções e nenhuma me atendeu.

Disponibilizo meu repositório para análise: https://github.com/GilbertoTADS/botmaker-chat.git

**Nova Informação:** Fiz uma query no banco em que consultar os dados já retirava os acentos e troca o çÇ pelo cC. Mas o problema continua.

**QUERY CITADA(parte relevante) ->** 

    ```const strQuery = `SELECT
            [(..outros campos aqui...)],
            LOWER(TRANSLATE(pv.DESCRICAOPRODUTO,
            'SZszYACEIOUAEIOUAEIOUAOEUIONYaaceiouaeiouaeiouaoeuionyy Cc',
            'ŠŽšžŸÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜÏÖÑÝåáçéíóúàèìòùâêîôûãõëüïöñýÿºÇç')) AS DESCRICAOPRODUTO
        FROM [(...continua...)]```
        

1 answer

0

SOLVED!! After much reading, my solution was very simple. Just set up:

process.env.DB2CODEPAGE = 1208; before: ibmdb.open(connStr)

And, baby! It worked great. I put it on record 'cause whoever wants to can try too.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.