문제

MSSQL2005 데이터베이스에 액세스하고 일부 데이터를 읽고 결과를 우편으로 보낸 PHP 스크립트가 있습니다.

일부 열 이름과 필드 자체에는 특수 문자가 있습니다.

내 브라우저 (Webserver IIS)를 통해 스크립트에 액세스하면 쿼리가 올바르게 실행되고 메일의 내용이 올바르게 (내 청중을 위해) 인코딩됩니다. 그러나 콘솔에서 PHP를 실행하면 쿼리가 실패합니다 (열 이름의 특수 문자로 인해). 쿼리의 특수 문자를 chr ()로 호출하고 라틴어 -1의 문자 코드를 교체하면 쿼리가 올바르게 실행되지만 결과는 라틴어 -1에서도 인코딩되어 메일에 올바르게 표시되지 않습니다. PHP/MSSQL 드라이버/… 두 시나리오에서 다른 인코딩을 사용하는 이유는 무엇입니까? 주위에 방법이 있습니까?

궁금하다면 SQLAGENT (또는 TaskManager 등)를 사용하여 스크립트를 예약하고 싶기 때문에 콘솔이 필요합니다.

도움이 되었습니까?

해결책

데이터베이스에있는 문자의 유형에 따라 생각하는 콘솔 제한 일 수 있습니다. 입력하면 chcp 콘솔에서 활성 코드 페이지가 무엇인지 알 수 있습니다. CP437 확장 된 ASCII라고도합니다. UTF8과 같이이 코드 페이지에 문자가있는 경우 문제가 발생할 수 있습니다. 입력하여 현재 활성 코드 페이지를 변경할 수 있습니다. chcp 65001 UTF8로 전환합니다.

필요한 문자에 따라 모든 글꼴이 확장 문자를 지원하는 것은 아니기 때문에 필요한 문자에 따라 기본 래스터 글꼴을 Lucida 콘솔로 변경할 수도 있습니다 (명령 프롬프트 창 제목, 속성, 글꼴).

이미 말했듯이, PHP의 유니 코드 지원은 이상적이지 않지만 몇 가지 잘 배치 된 기능 호출로 PHP5에서 수행 할 수 있습니다. UTF8_DECODE. 캐릭터 인코딩의 비밀은 현재 인코딩이 무엇인지 잘 이해하는 것입니다. 모두 사용중인 도구 : 데이터베이스, 데이터베이스 연결, PHP 변수의 현재 바이트, 콘솔 화면으로의 출력, 이메일 인코딩, 이메일 클라이언트 등 ...

특수 캐릭터가있는 모든 것에 대해, 우리의 현대에는 UTF8과 같은 것이 종종 권장됩니다. 길을 따라 모든 것이 UTF8로 설정되어 있는지 확인하고 필요한 경우에만 변환하십시오.

다른 팁

비 영어 세계에 대한 PHP의 열악한 지원은 잘 알려져 있습니다. 나는 기본 ASCII 영역 외부의 문자가있는 데이터베이스를 사용한 적이 없지만 분명히 당신은 이미 작업을 가지고 있으며 그냥 살아야하는 것 같습니다.

한 걸음 더 나아가고 싶다면 다음을 수행 할 수 있습니다.

그러나 쿼리가 하드 코딩된다면, 당신이 가진 것이 괜찮다고 생각합니다. 또한 최신 PHP (최소 4.4.x)를 사용하고 있는지 확인하십시오. 항상 고정 된 변경 사항이 있지만 4.xx 릴리스 노트를 훑어 보았으며 문제와 관련된 것은 없습니다.

PHP 문자열에 대해 기억해야 할 것은 바이트 스트림이라는 것입니다. 올바른 문자 세트에서 데이터를 가져 오려면 (수행중인 모든 일에 대해) 어떤 종류의 기능이나 필터를 통해이를 명시 적으로 수행해야합니다. 모두 꽤 낮은 수준입니다.

설정에 따라 데이터베이스에서 문자열의 내부 문자 세트를 알아야 할 수도 있지만 최소한 데이터베이스가 PHP로 전송하는 문자 세트를 알아야합니다 (PHP에 단지 스트림이기 때문입니다. 바이트).

그런 다음 대상 문자 세트를 알아야합니다 (어쨌든 실제로는 지정할 수 있습니다). 예를 들어, 데이터베이스에서 UTF-8을 받고 있지만 라틴 -1을 보내려고합니다 (따라서 'Content-Transfer-Encoding'으로 인코딩 된 Base64 또는 Q- 인쇄 가능한 인코딩) :

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

물론이 경우 모든 UTF-8 문자가 라틴 -1 문자 세트에 존재한다는 것을 알아야하며, 아마도 Base64를 원하지 않을 것입니다 (불행히도 PHP는 좋은 Q 인쇄 가능한 인코딩 기능이 없습니다. 호기심이 많지만 디코딩을 위해 수행), UTF-8 <=> Latin-1에 대해 이야기하지 않으면 대신 MBString 기능을 꺼내고 싶습니다.

콘솔까지는 콘솔에서 특수 문자를 입력 할 때 PHP가 무엇을 얻을 수 있는지 알아야합니다. 이는 아마도 쉘 및/또는 PHP 설정에 따라 다릅니다. 그러나 PHP는 줄을 바이트 바이트 바이트로만 이해하고 그것을 해결할 수 있어야한다는 것을 기억하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top