¿Son estos datos XML válidos (el valor del contenido del mensaje en particular)?
Lo obtengo de una API.
Luego recibo un error cuando paso este XML a una función de Postgres para guardarlo en la base de datos de Postgres.
<rows> <row messageDateUTC="2020-06-01T21:20:37.120" texterAddress="" texterStreet="" messageContent="Hey beautiful it's Scott!��" /> </rows>Me pregunto si es un problema de API, o un problema con el módulo del lado del cliente que genera el XML, o tal vez Postgres tiene un problema y no puede manejar estos caracteres.
Error aquí:
Caused by: org.postgresql.util.PSQLException: ERROR: invalid XML content Detail: line 5: xmlParseCharRef: invalid xmlChar value 55357 ddress="" texterStreet="" messageContent="Hey beautiful it's Scott!� ^ line 5: xmlParseCharRef: invalid xmlChar value 56842 " texterStreet="" messageContent="Hey beautiful it's Scott!�� ^ line 23: chunk is not well balancedtl; dr No, no son válidos, lo que sea que hizo la codificación tiene errores o se le dijo información de codificación incorrecta sobre la entrada.
55357 y 56842 son 0xD83D y 0xDE0A en hexadecimal respectivamente.
En Unicode están en rangos llamados "High Surrogate" y "Low Surrogate" respectivamente.
Eso significa que no son puntos de código Unicode adecuados, sino que se utilizan en UTF-16 para construir un único valor Unicode que no cabe en 16 bits (es decir, el plano multilingüe básico).
Estos dos valores específicos se decodifican en U+1F60A CARA SONRIENTE CON OJOS SONRIENTES . La entidad HTML decimal correcta para eso sería 😊 .
La razón más probable de esto es que alguna transformación que no conoce UTF-16 o pensó que este texto no es UTF-16 realizó la codificación (pero debería haber detectado que esos valores no son válidos e informó un error incluso en ese caso ).