CJK空格字符消失问题

3
我有一个PHP脚本,通过Salesforce API从Salesforce获取数据,并使用file_put_contents将输出写入文件。数据是韩文字符和英文字符的混合。
当我在运行Red Hat Enterprise Linux ES release 4 (Nahant Update 8)上安装PHP 5.2.8的计算机(1)或安装PHP 5.3.6的类似计算机(2)上运行该脚本时,韩文字母之间的空格会消失。
例如:(使用K表示韩文字母,E表示英文字母)
EEEEEEEEK KKK KKKK EEE KKKK显示为EEEEEEEKKKKKKKKEEE KKKK
但是,当我在运行CentOs上安装PHP 5.3.5的计算机(3)或在我的本地Windows计算机上运行PHP 5.3.6的计算机(4)上运行脚本时,文件中的文本是正确的。
有人能提出问题可能是什么吗?
编辑-最初我通过浏览器访问php脚本,但为了(希望)简化问题,我目前正在将输出存储在文本文件中并下载到我的Windows计算机。
编辑-Hex版本
原始文本-CFD란 무엇입니까?
来自(1)的十六进制-43 46 44 eb 9e 80 eb ac b4 ec 97 87 ec 9e 85 eb 8b 88 ea b9 8c 3f
来自(3)的十六进制-43 46 44 eb 9e 80 20 eb ac b4 ec 97 87 ec 9e 85 eb 8b 88 ea b9 8c 3f
编辑-用于选择文本的代码(省略了用户、密码、表、ID和路径)
<?php
ini_set("soap.wsdl_cache_enabled", "0");
require_once ("../soapclient/SforcePartnerClient.php");
require_once ("../soapclient/SforceHeaderOptions.php");
$partner_wsdl = "../soapclient/new-partner.wsdl.xml";
$client = new SforcePartnerClient();
$client->createConnection($partner_wsdl);
$loginResult = $client->login('--user--', '--pass--');
$query = "Select Name FROM --table-- WHERE Id = '--id--'";
$response = $client->query($query);
echo'<pre>';print_r($response);echo'</pre>';
$queryResult = new QueryResult($response);
foreach ($queryResult->records as $qr) {
    $content = $qr->fields->Name;
    file_put_contents('--path--',$content);
}
?>

你是如何从文件中读取内容的?你在每个盒子上都使用相同的编辑器吗? - MFTSBU
嗨,我正在使用Windows上的记事本来读取从创建它的盒子下载的文件。 - Mat
尝试使用十六进制编辑器(或其他可以让您查看文件原始字节的程序)打开文件,并查看发生了什么变化。 - MFTSBU
我已经将盒子1和盒子3的十六进制输出相加,唯一看到的区别是20消失了。我不明白一个空格怎么会消失,但其他所有东西都正确。 - Mat
1
是的,这显然是一个空格消失了。这是一个奇怪的问题,似乎是由软件中的差异(或错误)引起的,很难追踪。你可以尝试一些其他的方法,比如1.发布代码,2.定期打印字符串(例如,在从Salesforce获取字符串后以及之后可能发生的任何变化之后)。 - MFTSBU
1个回答

0

经过更多的研究,我发现了SforcePartnerClient.php中的一个函数。

$QueryResult = $this->sforce->query(array ('queryString' => $query))->result;

根据使用的框,返回不同的值。

框1和2:

<sf:Name>CFD&#xB780; &#xBB34;&#xC5C7;&#xC785;&#xB2C8;&#xAE4C;?</sf:Name>

第三和第四个方框:

<sf:Name>CFD란 무엇입니까?</sf:Name>

当这个与XML解析器(文件后面)和WSDL文件结合/解析/转换时,XML解析器会剥离在连续的&#xxxxx; s之间出现的所有空格 - 我相信这与一个bug有关 https://bugs.php.net/bug.php?id=33240 为了避免这种情况,我建议将SforcePartnerClient.php的第364行注释掉

xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );

不幸的是,我不知道这是否会对使用SforcePartnerClient.php的其他代码产生任何不良影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接