“Â € ™” que aparece en la página en lugar de “'”


133

’se muestra en mi página en lugar de '.

Tengo el Content-Typeconjunto UTF-8en mi <head>etiqueta y mis encabezados HTTP:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

ingrese la descripción de la imagen aquí

Además, mi navegador está configurado para Unicode (UTF-8):

ingrese la descripción de la imagen aquí

Entonces, ¿cuál es el problema y cómo puedo solucionarlo?


Respuestas:


55

Asegúrese de que el navegador y el editor estén usando la codificación UTF-8 en lugar de ISO-8859-1 / Windows-1252.

O utilice &rsquo;.


75
No, no está resuelto. Todavía hay una inconsistencia en la codificación de caracteres en su aplicación. Volverá a encontrar el mismo problema en el futuro para otros caracteres que no sean CP1252. Y hay muchos de ellos ...
BalusC

12
Ejemplos de personajes que continuará encontrando: i18nqa.com/debug/utf8-debug.html
Zoot

codificación utf-8 +1
Karuhanga

217

Entonces, cuál es el problema,

Es un personaje ( RIGHT SINGLE QUOTATION MARK- U + 2019) que se decodifica como CP-1252 en lugar de UTF-8 . Si verifica la tabla de codificaciones , verá que este carácter está en UTF-8 compuesto de bytes 0xE2, 0x80y 0x99. Si verifica el diseño de la página de códigos CP-1252 , verá que cada uno de esos bytes representa los caracteres individuales â, y .


y como puedo arreglarlo?

Use UTF-8 en lugar de CP-1252 para leer, escribir, almacenar y mostrar los caracteres.


Tengo el tipo de contenido establecido en UTF-8 tanto en mi <head>etiqueta como en mis encabezados HTTP:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Esto solo le indica al cliente qué codificación usar para interpretar y mostrar los caracteres. Esto no le indica a su propio programa qué codificación usar para leer, escribir, almacenar y mostrar los caracteres. La respuesta exacta depende de la plataforma del servidor / base de datos / lenguaje de programación utilizado. Tenga en cuenta que el conjunto en el encabezado de respuesta HTTP tiene prioridad sobre la metaetiqueta HTML. La metaetiqueta HTML solo se usaría cuando la página se abra desde el sistema de archivos del disco local en lugar de desde HTTP.


Además, mi navegador está configurado para Unicode (UTF-8):

Esto solo obliga al cliente a utilizar la codificación para interpretar y mostrar los caracteres. Pero el problema real es que ya está enviando ’(codificado en UTF-8) al cliente en lugar de . El cliente se muestra correctamente ’utilizando la codificación UTF-8. Si el cliente recibió instrucciones erróneas para usar, por ejemplo, ISO-8859-1, es probable que haya visto en su ââ¬â¢lugar.


Estoy usando ASP.NET 2.0 con una base de datos.

Es muy probable que este sea el problema. Debe verificar con una herramienta de base de datos independiente cómo se ven los datos.

Si el personaje está allí, entonces no se está conectando a la base de datos correctamente. Debe indicarle al conector de la base de datos que use UTF-8.

Si su base de datos contiene ’, entonces es su base de datos la que está en mal estado. Lo más probable es que las tablas no estén configuradas para usar UTF-8. En cambio, utilizan la codificación predeterminada de la base de datos, que varía según la configuración. Si este es su problema, por lo general, basta con alterar la tabla para usar UTF-8. Si su base de datos no lo admite, deberá volver a crear las tablas. Es una buena práctica establecer la codificación de la tabla cuando la cree.

Lo más probable es que estés usando SQL Server, pero aquí hay un código MySQL (copiado de este artículo ):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

Sin embargo, si su mesa ya es UTF-8, debe retroceder un paso. Quién o qué puso los datos allí. Ahí es donde está el problema. Un ejemplo serían los valores enviados por formulario HTML que están codificados / decodificados incorrectamente.


Aquí hay algunos enlaces más para aprender más sobre el problema:


2
Si tiene contenido roto como este guardado en algún lugar, por ejemplo, en una base de datos mysql, stackoverflow.com/a/9407998/117647 tiene el truco que necesita para convertir los caracteres a utf-8
Steve

55
TL; DR; Use UTF-8 para leer, escribir, almacenar y mostrar los caracteres.
c0degeas

Tenga en cuenta que las tablas iso-8859-1 y Windows-1252 se superponen, por lo que algunas "combinaciones de caracteres extraños" son comunes a ambos (por ejemplo, "è" para "é").
Skippy le Grand Gourou

15

Tengo algunos documentos donde se mostraba como …y êse mostraba como ê. Así es como llegó allí (código python):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

Para solucionar el problema, usé un código de Python como este:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(Debido a que alguien había insertado la versión de Twingled en un documento UTF-8 correcto, en realidad tuve que extraer solo la parte de Twingled, desviarla e insertarla nuevamente. Usé BeautifulSoup para esto).

Es mucho más probable que tenga un Charlie en la creación de contenido que la configuración del servidor web es incorrecta. También puede forzar a su navegador web a que doble la página seleccionando la codificación windows-1252 para un documento utf-8. Su navegador web no puede desviar el documento que Charlie guardó.

Nota : el mismo problema puede ocurrir con cualquier otra página de códigos de un solo byte (por ejemplo, latin-1) en lugar de windows-1252.


14

(Punto de código Unicode U+2019 RIGHT SINGLE QUOTATION MARK) está codificado en UTF-8 como bytes:

0xE2 0x80 0x99.

’(Puntos de código Unicode U+00E2 U+20AC U+2122) está codificado en UTF-8 como bytes:

0xC3 0xA2   0xE2 0x82 0xAC   0xE2 0x84 0xA2.

Estos son los bytes que su navegador realmente está recibiendo para producir ’cuando se procesa como UTF-8.

Eso significa que sus datos de origen están pasando por dos conversiones de juego de caracteres antes de ser enviados al navegador:

  1. El carácter fuente ( U+2019) se codifica primero como bytes UTF-8:

    0xE2 0x80 0x99

  2. esos bytes individuales fueron luego ser mis-interpretados y decodificada a puntos de código Unicode U+00E2 U+20AC U+2122por uno de los de Windows-125x juegos de caracteres (1252, 1254, 1256, y 1258 todo mapa 0xE2 0x80 0x99a U+00E2 U+20AC U+2122), y entonces esos puntos de código están siendo codificados como UTF-8 bytes:

    0xE2-> U+00E2->0xC3 0xA2
    0x80 -> U+20AC-> 0xE2 0x82 0xAC
    0x99-> U+2122->0xE2 0x84 0xA2

Debe encontrar dónde se realiza la conversión adicional en el paso 2 y eliminarla.


12

Esto a veces sucede cuando una cadena se convierte de Windows-1252 a UTF-8 dos veces .

Teníamos esto en una aplicación Zend / PHP / MySQL donde caracteres como ese aparecían en la base de datos, probablemente debido a que la conexión MySQL no especificaba el conjunto de caracteres correcto. Tuvimos que:

  1. Asegúrese de que Zend y PHP se comuniquen con la base de datos en UTF-8 ( no era por defecto)

  2. Repare los caracteres rotos con varias consultas SQL como esta ...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    Haga esto para tantas tablas / columnas como sea necesario.

También puede corregir algunas de estas cadenas en PHP si es necesario. Tenga en cuenta que debido a que los caracteres se han codificado dos veces , en realidad necesitamos hacer una conversión inversa de UTF-8 a Windows-1252, lo que me confundió al principio.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’

9

Tienes una falta de coincidencia en la codificación de tu personaje; su cadena está codificada en una codificación (UTF-8) y lo que sea que esté interpretando esta página está utilizando otra (digamos ASCII).

Siempre especifique su codificación en sus encabezados http y asegúrese de que coincida con la definición de codificación de su marco.

Encabezado http de muestra:

Content-Type    text/html; charset=utf-8

Configuración de codificación en asp.net

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Establecer codificación en jsp


7

Si su tipo de contenido ya es UTF8, es probable que los datos ya estén llegando a la codificación incorrecta. Si obtiene los datos de una base de datos, asegúrese de que la conexión de la base de datos use UTF-8.

Si se trata de datos de un archivo, asegúrese de que el archivo esté codificado correctamente como UTF-8. Por lo general, puede configurar esto en el cuadro de diálogo "Guardar como ..." del editor que elija.

Si los datos ya están rotos cuando los ve en el archivo fuente, lo más probable es que solía ser un archivo UTF-8 pero se guardó con la codificación incorrecta en algún lugar del camino.


4

Si alguien recibe este error en el sitio web de WordPress, debe cambiar wp-config db charset:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

en vez de:

define('DB_CHARSET', 'utf8mb4');

0

En DBeaver (u otros editores), el archivo de script que está trabajando puede solicitar que se guarde como UTF8 y eso cambiará el carácter:

â € “

dentro

–

o

–

-1

Debe tener copiar / pegar texto del documento de Word. El documento de Word utiliza citas inteligentes. Puede reemplazarlo con un carácter especial (& rsquo;) o simplemente escribir su editor HTML (').

Estoy seguro de que esto resolverá tu problema.


-3

Lo mismo me sucedió con el carácter '-' (signo menos largo).
Usé este simple reemplazo, así que resuélvelo:

htmlText = htmlText.Replace('–', '-');

44
El problema del OP es mojibake, no caracteres Unicode similares.
Cole Johnson
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.