{"id":465,"date":"2017-08-27T01:02:54","date_gmt":"2017-08-27T01:02:54","guid":{"rendered":"http:\/\/www.gnial.com.br\/gnialhelp\/?p=465"},"modified":"2019-11-26T10:39:57","modified_gmt":"2019-11-26T13:39:57","slug":"parte-1-de-2-mysql-php-iso-utf8-utf8_general_ci-utf8_unicode_ci","status":"publish","type":"post","link":"http:\/\/www.gnial.com.br\/gnialhelp\/parte-1-de-2-mysql-php-iso-utf8-utf8_general_ci-utf8_unicode_ci\/","title":{"rendered":"Parte 1 de 2 &#8211; MYSQL, PHP, ISO, utf8, utf8_general_ci, utf8_unicode_ci"},"content":{"rendered":"<p>Artigo 1<\/p>\n<p><a href=\"http:\/\/www.gnial.com.br\/gnialhelp\/parte-2-de-2-mysql-php-iso-utf8-utf8_general_ci-utf8_unicode_ci\/\">Artigo 2<\/a><\/p>\n<h3>Introdu\u00e7\u00e3o<\/h3>\n<p>UTILIZE SEMPRE UFT8! O motivo \u00e9 simples, essa codifica\u00e7\u00e3o \u00e9 rica em caracteres especiais, abrange muitas l\u00ednguas, e \u00e9 utilizada como padr\u00e3o nos navegadores e bancos de dados.<\/p>\n<h4>Antes eu utilizava iso-8859-1 como padr\u00e3o, mesmo inserindo libraries e components em uft8. Depois que migrei arquivos, bancos e tudo para uft8 minha vida melhorou.<\/h4>\n<div class=\"post-text\">\n<p>Isso porque: no momento que a p\u00e1gina come\u00e7a a renderizar, ela j\u00e1 assume uma codifica\u00e7\u00e3o (ou tenta detect\u00e1-la acaso n\u00e3o seja declarada, geralmente usa o padr\u00e3o do servidor) o que pode gerar um desconforto j\u00e1 que haver\u00e1 uma mistura de codifica\u00e7\u00f5es nos seus arquivos e de terceiros.<\/p>\n<h2>Os problemas comuns da codifica\u00e7\u00e3o<\/h2>\n<p>\u00c9 muito comum quando estamos trabalhando com acentos nos depararmos com caracteres estranhos como por exemplo:<\/p>\n<ul>\n<li>Algo semelhante a\u00a0<code>\u00c3\u00a9<\/code>\u00a0que representa o\u00a0<code>\u00e9<\/code>, isto ocorre porque o caractere \u00e9 unicode, mas a p\u00e1gina est\u00e1 em iso-8859-1 (ou outro compat\u00edvel).<\/li>\n<li>E o sinal\u00a0<code>\ufffd<\/code>\u00a0um exemplo de situa\u00e7\u00e3o \u00e9 quando voc\u00ea usa um acentos compat\u00edveis com iso-8859-1 em uma p\u00e1gina que esta tentando processar UTF-8 devido ao\u00a0<code>Content-Type: ...; charset=utf8<\/code>.<\/li>\n<\/ul>\n<h2>Para se usar UTF-8, voc\u00ea deve utilizar:<\/h2>\n<ul>\n<li>PHP scripts (me refiro aos arquivos no servidor e n\u00e3o a resposta do mesmo) salvos em &#8220;utf-8 sem BOM&#8221;<\/li>\n<li>MySQL (ou outro tipo de banco de dados) com\u00a0<code>charset=utf-8<\/code><\/li>\n<li>Preferencialmente defina usando PHP\u00a0<code>header('Content-type: text\/html; charset=UTF-8');<\/code><\/li>\n<\/ul>\n<blockquote><p><strong>Nota:<\/strong>\u00a0A vantagem do UTF-8 \u00e9 que voc\u00ea pode utilizar v\u00e1rios &#8220;idiomas&#8221; na sua p\u00e1gina com caracteres que n\u00e3o s\u00e3o suportados pelo &#8220;iso-8859-1&#8221;.<\/p><\/blockquote>\n<h2>Sobre o iso-8859-1<\/h2>\n<p>Eu recomendo usar\u00a0<code>iso-8859-1<\/code>\u00a0se o seu site for\u00a0<em>&#8220;100% em Portugu\u00eas&#8221;<\/em>\u00a0e voc\u00ea n\u00e3o necessite de &#8220;codifica\u00e7\u00f5es extras&#8221; (como por exemplo emojis), no entanto mesmo sendo em Portugu\u00eas voc\u00ea deve pensar em talvez migrar pro\u00a0<em>utf-8<\/em>, um dos motivos \u00e9 que em junho de 2004, o grupo de desenvolvimento da ISO\/IEC respons\u00e1vel por sua manuten\u00e7\u00e3o declarou o fim do suporte a esta codifica\u00e7\u00e3o, concentrando-se no UCS e no Unicode.<\/p>\n<p><sub>Fonte:\u00a0<a href=\"http:\/\/pt.wikipedia.org\/wiki\/ISO_8859-1\" rel=\"noreferrer\">http:\/\/pt.wikipedia.org\/wiki\/ISO_8859-1<\/a><\/sub><\/p>\n<p>Se decidir usar UTF-8 no seu site\/projeto, recomendo seguir os seguintes passos:<\/p>\n<h2>Scripts PHP com UTF-8 sem &#8220;BOM&#8221;<\/h2>\n<blockquote><p><strong>Nota:<\/strong>\u00a0leia sobre isto em\u00a0<a href=\"http:\/\/en.wikipedia.org\/wiki\/UTF-8#Byte_order_mark\" rel=\"noreferrer\">http:\/\/en.wikipedia.org\/wiki\/UTF-8#Byte_order_mark<\/a>\u00a0(Ingl\u00eas)<\/p><\/blockquote>\n<p>Voc\u00ea deve salvar todos scripts PHP (at\u00e9 os que voc\u00ea usar\u00e1 com\u00a0<code>include<\/code>,\u00a0<code>require<\/code>, etc) em utf-8 sem &#8220;BOM&#8221;, voc\u00ea pode utilizar softwares como\u00a0<a href=\"http:\/\/www.sublimetext.com\/\" rel=\"noreferrer\">SublimeText<\/a>\u00a0ou\u00a0<a href=\"http:\/\/notepad-plus-plus.org\/\" rel=\"noreferrer\">notepad++<\/a>\u00a0para converter os arquivos:<\/p>\n<ul>\n<li>Usando notepad++:<img decoding=\"async\" src=\"https:\/\/i.stack.imgur.com\/KHSj7.png\" alt=\"utf8 sem bom notepad++\" \/><\/li>\n<li>Usando Sublime Text:<img decoding=\"async\" src=\"https:\/\/i.stack.imgur.com\/z92bm.png\" alt=\"utf8 sublime sublimetext\" \/><\/li>\n<li>Usando Eclipse v\u00e1 at\u00e9\u00a0<kbd>Window<\/kbd>\u00a0&gt;\u00a0<kbd>Preferences<\/kbd>\u00a0&gt;\u00a0<kbd>General<\/kbd>\u00a0&gt;\u00a0<kbd>Workspace<\/kbd>\u00a0&gt;\u00a0<kbd>Text File Encoding<\/kbd>:<img decoding=\"async\" src=\"https:\/\/i.stack.imgur.com\/O1Pmg.png\" alt=\"netbeans\" \/><\/li>\n<\/ul>\n<blockquote><p><strong>Nota:<\/strong>\u00a0que arquivos com extens\u00e3o\u00a0<code>.js<\/code>\u00a0ou\u00a0<code>.css<\/code>\u00a0que usam acentos no conte\u00fado tamb\u00e9m ser salvos com a mesma codifica\u00e7\u00e3o que as p\u00e1ginas, da mesma maneira que foi usado para salvar os documentos descritos acima, eventualmente arquivos\u00a0<code>.svg<\/code>\u00a0podem ser embarcados ent\u00e3o se eles tiverem qualquer acentua\u00e7\u00e3o ou caractere diferente tamb\u00e9m devem ser salvos com a mesma codifica\u00e7\u00e3o da p\u00e1gina<\/p><\/blockquote>\n<h2>MySQL com UTF-8<\/h2>\n<p>Para criar uma tabela em UTFf-8 no MySQL voc\u00ea deve utilizar algo como:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"pln\">CREATE TABLE minhatabela <\/span><span class=\"pun\">(<\/span><span class=\"pln\">\r\n   id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY<\/span><span class=\"pun\">,<\/span><span class=\"pln\">\r\n   titulo varchar<\/span><span class=\"pun\">(<\/span><span class=\"lit\">300<\/span><span class=\"pun\">)<\/span><span class=\"pln\"> DEFAULT NULL\r\n<\/span><span class=\"pun\">)<\/span><span class=\"pln\"> ENGINE<\/span><span class=\"pun\">=<\/span><span class=\"typ\">InnoDB<\/span><span class=\"pln\"> CHARACTER SET<\/span><span class=\"pun\">=<\/span><span class=\"pln\">utf8 COLLATE utf8_unicode_ci<\/span><span class=\"pun\">;<\/span><\/code><\/pre>\n<p>Se as tabelas existem, ent\u00e3o primeiro fa\u00e7a um BACKUP delas e depois, utilize um dos seguintes comandos (conforme a necessidade):<\/p>\n<ul>\n<li>Converte banco de dados:\u00a0<code>ALTER DATABASE bancodedados CHARACTER SET utf8 COLLATE utf8_unicode_ci;<\/code><\/li>\n<li>Converte uma tabela especifica:\u00a0<code>ALTER TABLE minhatabela CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;<\/code><\/li>\n<\/ul>\n<p>Al\u00e9m de criar as tabelas em UTF-8 \u00e9 necess\u00e1rio definir a conex\u00e3o como UTF-8.<\/p>\n<p>Com PDO \u00e9 necess\u00e1rio usar\u00a0<a href=\"http:\/\/php.net\/manual\/pt_BR\/pdo.exec.php\" rel=\"noreferrer\"><code>exec<\/code><\/a>:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"pln\">$conn <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span><span class=\"pln\"> PDO<\/span><span class=\"pun\">(<\/span><span class=\"str\">'mysql:host=HOST;dbname=BANCO;charset=utf-8'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'USUARIO'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'SENHA'<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n$conn<\/span><span class=\"pun\">-&gt;<\/span><span class=\"kwd\">exec<\/span><span class=\"pun\">(<\/span><span class=\"str\">'SET CHARACTER SET utf8'<\/span><span class=\"pun\">);<\/span><span class=\"com\">\/\/Define o charset como UTF-8<\/span><\/code><\/pre>\n<p>Com o mysqli \u00e9 necess\u00e1rio usar\u00a0<a href=\"http:\/\/php.net\/manual\/pt_BR\/mysqli.set-charset.php\" rel=\"noreferrer\"><code>mysqli_set_charset<\/code><\/a>:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"pln\">$mysqli <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span><span class=\"pln\"> mysqli<\/span><span class=\"pun\">(<\/span><span class=\"str\">'HOST'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'usuario'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'senha'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'banco'<\/span><span class=\"pun\">);<\/span>\r\n\r\n<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">$mysqli<\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\">connect_error<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    printf<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Erro de conex\u00e3o: %s'<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> $mysqli<\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\">connect_errno<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">exit<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"com\">\/*\r\n * compatibilidade para to 5.2.9 e 5.3.0.\r\n *\/<\/span>\r\n<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">mysqli_connect_error<\/span><span class=\"pun\">())<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    printf<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Erro de conex\u00e3o: %s'<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> mysqli_connect_error<\/span><span class=\"pun\">());<\/span>\r\n    <span class=\"kwd\">exit<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"kwd\">false<\/span> <span class=\"pun\">===<\/span><span class=\"pln\"> $mysqli<\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\">set_charset<\/span><span class=\"pun\">(<\/span><span class=\"str\">'utf8'<\/span><span class=\"pun\">))<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    printf<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Error ao usar utf8: %s'<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> $mysqli<\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\">error<\/span><span class=\"pun\">);<\/span>\r\n    <span class=\"kwd\">exit<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>Com mysqli procedural:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"pun\">&lt;?<\/span><span class=\"pln\">php\r\n$link <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> mysqli_connect<\/span><span class=\"pun\">(<\/span><span class=\"str\">'HOST'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'usuario'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'senha'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'banco'<\/span><span class=\"pun\">);<\/span>\r\n\r\n<span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">mysqli_connect_error<\/span><span class=\"pun\">())<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    printf<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Erro de conex\u00e3o: %s'<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> mysqli_connect_error<\/span><span class=\"pun\">());<\/span>\r\n    <span class=\"kwd\">exit<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span>\r\n\r\n<span class=\"kwd\">if<\/span> <span class=\"pun\">(!<\/span><span class=\"pln\">mysqli_set_charset<\/span><span class=\"pun\">(<\/span><span class=\"pln\">$link<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'utf8'<\/span><span class=\"pun\">))<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\r\n    printf<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Error ao usar utf8: %s'<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> mysqli_error<\/span><span class=\"pun\">(<\/span><span class=\"pln\">$link<\/span><span class=\"pun\">));<\/span>\r\n    <span class=\"kwd\">exit<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<h2>Definindo o charset da p\u00e1gina<\/h2>\n<p>Voc\u00ea pode usar a tag\u00a0<code>&lt;meta&gt;<\/code>\u00a0para definir o charset, mas o recomend\u00e1vel \u00e9 voc\u00ea fazer isto na resposta da requisi\u00e7\u00e3o (resposta do servidor), definindo os &#8220;headers&#8221; (isto n\u00e3o quer dizer que voc\u00ea n\u00e3o deva utilizar\u00a0<code>&lt;meta&gt;<\/code>).<\/p>\n<p>Para isto, no PHP use a fun\u00e7\u00e3o\u00a0<a href=\"http:\/\/php.net\/manual\/pt_BR\/function.header.php\" rel=\"noreferrer\"><code>header<\/code><\/a>:<\/p>\n<p>O motivo para se utilizar na resposta do servidor tamb\u00e9m \u00e9 por causa do tempo de renderiza\u00e7\u00e3o da p\u00e1gina quanto a resposta do servidor e p\u00e1ginas\u00a0<em>AJAX<\/em>\u00a0precisam tamb\u00e9m do charset definido por\u00a0<code>header();<\/code>.<\/p>\n<blockquote><p>Nota:\u00a0<code>header();<\/code>\u00a0sempre deve ir no topo do script antes de qualquer\u00a0<code>echo<\/code>,\u00a0<code>print<\/code>, ou outro tipo de exibi\u00e7\u00e3o de conte\u00fado.<\/p><\/blockquote>\n<p>Em arquivos que a resposta deve ser HTML:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"pun\">&lt;?<\/span><span class=\"pln\">php\r\nheader<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Content-Type: text\/html; charset=UTF-8'<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n\r\necho <\/span><span class=\"str\">'Conteudo'<\/span><span class=\"pun\">;<\/span><\/code><\/pre>\n<\/div>\n<table class=\"fw\">\n<tbody>\n<tr>\n<td class=\"vt\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Artigo 1 Artigo 2 Introdu\u00e7\u00e3o UTILIZE SEMPRE UFT8! O motivo \u00e9 simples, essa codifica\u00e7\u00e3o \u00e9 rica em caracteres especiais, abrange muitas l\u00ednguas, e \u00e9 utilizada como padr\u00e3o nos navegadores e bancos de dados. Antes eu utilizava iso-8859-1 como padr\u00e3o, mesmo inserindo libraries e components em uft8. Depois que migrei arquivos, bancos e tudo para uft8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":565,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","has-thumbnail"],"_links":{"self":[{"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/posts\/465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/comments?post=465"}],"version-history":[{"count":5,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/posts\/465\/revisions"}],"predecessor-version":[{"id":570,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/posts\/465\/revisions\/570"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/media\/565"}],"wp:attachment":[{"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/media?parent=465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/categories?post=465"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gnial.com.br\/gnialhelp\/wp-json\/wp\/v2\/tags?post=465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}