ColdFusion 2018을 실행하는 서버에서 다음 코드를 실행할 때 :
<cfsetting enablecfoutputonly="yes">
<cfxml variable="test">
<cfoutput>
<test>
áéíóú
</test>
</cfoutput>
</cfxml>
<cfset testString = ToString(test)>
<cfset testStringISO = Replace(testString, "UTF-8", "iso-8859-1")>
<cffile action="write" file="#AbsoluteFilesPath#test.xml" output="#testStringISO#" charset="iso-8859-1">
AbsoluteFilesPath
서버의 위치에 대한 절대 참조는 어디에 있습니까 ? XML 인코딩을 변경하는 데 사용하는 방법은 여기에 있습니다 . test.xml
내가 ++ 메모장에서 서버를 열고이 같은 파일 외모 :
<?xml version="1.0" encoding="iso-8859-1"?>
<test>
αινσϊ
</test>
파일 인코딩은 "ISO 8859-7"로 표시됩니다.
흥미롭게도 로컬 컴퓨터에서 VSCode로 파일을 열면 다음과 같이 표시됩니다.
<?xml version="1.0" encoding="iso-8859-1"?>
<test>
�����
</test>
여기서 파일의 인코딩은 "UTF-8"로 표시됩니다. 편집기에서 "ISO 8859-1 인코딩으로 다시 열기"명령을 선택하면 파일이 다음과 같이 표시됩니다.
<?xml version="1.0" encoding="iso-8859-1"?>
<test>
áéíóú
</test>
"iso-8859-1"을 "utf-16"으로 대체하여이 코드를 테스트했으며 결과는 동일합니다.
파일 인코딩이 일관성이없고 예상 한 것과 다른 이유는 무엇입니까? 파일이 올바른 인코딩으로 생성되었는지 어떻게 확인할 수 있습니까?
먼저 무엇인가를 명확히합시다 encoding
. XML 파일 의 속성은 독자를위한 지표 일뿐입니다. 실제 파일에 기록 된 바이트에는 영향을주지 않습니다.
따라서 예제 코드를 단일 문자로 단순화 해 보겠습니다 á
.
UTF-8은 2 바이트를 저장하고 ISO-8859-1은 1 바이트를 저장합니다. 이것이 우리가 기대하는 것입니다.
<cfsetting enablecfoutputonly="true">
<cfxml variable="test">
<cfoutput><r>á</r></cfoutput>
</cfxml>
<cfset xmlForUTF = toString(test)>
<cfset xmlForISO = replace(xmlForUTF, 'encoding="UTF-8"', 'encoding="ISO-8859-1"')>
<cfset fileWrite(expandPath("UTF-8.xml"), xmlForUTF, "UTF-8")>
<cfset fileWrite(expandPath("ISO-8859-1.xml"), xmlForISO, "ISO-8859-1")>
이것이 바로 우리가 기대했던 것입니다. 어느 쪽 cfxml
도 cffile
/ fileWrite
문제 없다. 그렇다면 컴퓨터에서 위의 코드로 동일한 결과를 얻지 못할 수있는 이유는 무엇입니까?
ColdFusion은 템플릿 파일 ( .cfm
)과 구성 요소 파일 ( .cfc
)을 구문 분석 할 때 JVM의 기본 인코딩을 사용합니다.이 인코딩은 달리 지정하지 않는 한 시스템의 기본 인코딩입니다. 이것은 또한 모든 사람이 위의 코드로 다른 결과를 얻을 수있는 이유이기도합니다.
á
파일에서 와 같은 리터럴이있는 경우이 문자는 텍스트 편집기에서 사용하도록 지정한 것을 사용하여 인코딩됩니다. 그것이 UTF-8
. 파일을 살펴보면 캐릭터가 제대로 저장되어있는 것을 볼 수 있습니다. 그러나 ColdFusion에서이 파일을 열고 리터럴을 구문 분석 할 때 문자가 시스템의 기본 인코딩으로 인코딩 된 것으로 간주합니다. 그리고 불행히도 시스템 전체 코드 세트로 UTF-8을 사용하지 않거나 사용할 수없는 시스템을 실행하는 것 같습니다 (예 : Windows).
ColdFusion이 파서 (모든 .cfm
/ .cfc
파일) 와 접촉하는 모든 파일을 BOM이있는 UTF-8 로 저장 합니다. ColdFusion에서 파일 시작 부분에서 이러한 바이트를 발견하면 BOM이 의미하는 바가 있기 때문에 UTF-8을 사용해야합니다.
-Dfile.encoding=UTF-8
ColdFusion JVM에 추가 합니다. 매개 변수는 여기에 추가 할 수 있습니다 /cfusion/bin/jvm.config
(행 : java.args=
)
이를 위해서는 ColdFusion을 다시 시작해야합니다. 그런 다음 모든 파일을 BOM없이 간단한 UTF-8로 저장할 수 있으며 제대로 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다