Pergunta

Eu tenho um script php que acessa um banco de dados MSSQL2005, lê alguns dados e envia os resultados em um e-mail.

Existem caracteres especiais em ambos os alguns nomes de coluna e na própria campos.

Quando eu acessar o script através do meu navegador (servidor web IIS), a consulta é executada corretamente e o conteúdo do e-mail são corretamente (para o meu público) codificado. No entanto, quando eu executar php a partir do console, a consulta falha (devido aos caracteres especiais em nomes de coluna). Se eu substituir os caracteres especiais na consulta com chamadas para chr () eo código de caracteres em latim-1, a consulta é executado corretamente, mas os resultados também são codificados em Latim-1 e, portanto, não exibido corretamente no correio. Por que é PHP / o driver MSSQL / ... usando uma codificação diferente nos dois cenários? Existe uma maneira de contornar isso?

Se você quer saber, eu preciso do console porque eu quero para agendar o script usando SQLAgent (ou taskmanager ou qualquer outro).

Foi útil?

Solução

Dependendo do tipo de caracteres que você tem em seu banco de dados, pode ser uma limitação do console eu acho. Se você digitar chcp no console, você verá o que é a página de código ativa, o que poderia algo como CP437 também conhecido como ASCII estendido. Se você tiver caracteres fora da página de código, como em UTF8, que você pode executar em problemas. Você pode alterar a página de código atual ativa por chcp 65001 digitação para alternar para UTF8.

Você também pode querer mudar a fonte de varredura padrão para Lucida Console dependendo dos caracteres necessários pois nem todas as fontes suportar caracteres estendidos (clique direito sobre título, propriedades, fonte prompt de comando da janela).

Como já foi dito, suporte a Unicode do PHP não é o ideal, mas você pode gerenciar a fazê-lo em PHP5 com alguns chamada de função bem colocado de utf8_decode . O segredo de codificação de caracteres é entender bem o que é a codificação atual do todas as ferramentas que você está usando: banco de dados, conexão de dados, bytes atuais em sua variável de PHP, a sua saída para a tela do console, os de e-mail codificação de corpo, o seu cliente de e-mail, e assim por diante ...

Para tudo o que têm caracteres especiais, nos nossos dias modernos, algo como UTF8 é frequentemente recomendada. Certifique-se de tudo ao longo do caminho está definido para UTF8 e converter apenas quando necessário.

Outras dicas

fraco suporte do PHP para o mundo não Inglês é bem conhecida. Eu nunca usei um banco de dados com caracteres fora do reino básica ASCII, mas, obviamente, você já tem um trabalho ao redor e parece que você só tem que viver com ela.

Se você quiser dar um passo adiante, você pode: 1. Adicione uma matriz que contém todos os caracteres especiais e suas equivalentes CHR 2. foreach a matriz e str_replace na consulta

Mas se a consulta é codificado, eu acho que você tem é bom. Além disso, verifique se você está usando a última PHP, pelo menos 4.4.x, há sempre uma mudança este foi fixas mas eu desnatado as notas de lançamento 4.x.x e eu não vejo nada que se relaciona com o seu problema.

A coisa a lembrar sobre cordas PHP é que eles são fluxos de bytes. Se você deseja obter os dados no conjunto de caracteres correto (para o que você está fazendo), você tem que fazer isso de forma explícita através de algum tipo de função ou filtro. É tudo de baixo nível muito.

Dependendo da configuração, você pode precisar de saber o conjunto de caracteres interna das cordas no banco de dados, mas pelo menos você precisa saber o conjunto de caracteres do banco de dados está enviando para PHP (porque, lembre-se, para o PHP é apenas um fluxo de bytes).

Em seguida, você tem que saber o conjunto de caracteres de destino (e, possivelmente, especificá-lo, o que você realmente deve de qualquer maneira). Por exemplo, digamos que você está recebendo utf-8 do banco de dados, mas desejo de enviar um latino-1 (e, portanto, base64 ou q-imprimíveis codificado como 'Content-de transferência de codificação'):

$send_string = base64_encode(utf8_decode($database_string));

É claro que, neste caso, você tem que saber que existem todos os caracteres do UTF-8 no conjunto de caracteres Latin-1, e você provavelmente não quer realmente base64 (PHP infelizmente não tem uma boa q- função de codificação de impressão, embora, curiosamente, ele faz para a descodificação), e se você não está falando de utf-8 <=> latino-1 você vai querer sacar as funções mbstring vez.

Quanto ao console, você tem que saber o PHP está recebendo quando você está digitando caracteres especiais do console, que provavelmente depende do shell e / ou configuração do PHP. Mas lembre-se que o PHP só entende cordas como byte byte byte e você deve ser capaz de trabalhar com isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top