如何通过RFC将汉字从SAP发送到PHP?
How to send Chinese characters from SAP to PHP through RFC?
我正在使用函数 module.i 通过 RFC 与 PHP 通信,试图将中文字符从功能模块发送到 PHP,但在 PHP 端我得到的是中文###### ,
形式的字符
我不明白问题出在哪一方,PHP 一方还是 SAP 一方?
任何人都给我建议我需要关注哪一边来纠正这个问题?或任何其他方式将中文字符发送到 PHP?
SAP FM Code:FN 姓名:ZMM_PHP_TO_SAP
t_log-msgty = 'E'.
CONCATENATE p_uname '用户无检料权限' INTO t_log-msgtx SEPARATED BY space.
APPEND t_log.
PHP代码:
$LOGIN = array ("ASHOST"=>$row_login1["sap_server"],
"SYSNR"=>$row_login1["sap_system_number"],
"CLIENT"=>$row_login1["sap_client"],
"USER"=>$row_login1["sap_username"],
"PASSWD"=>$row_login1["sap_password"],
"CODEPAGE"=>"8300");
$rfc = saprfc_open ($LOGIN);
if(!$rfc){
$error=saprfc_error();
return "The RFC connection has failed with the following error:".saprfc_error();
exit;}
$fce = saprfc_function_discover($rfc,"ZMM_PHP_TO_SAP");
if(!$fce){
return "The function module has failed.";
return $rfc;
exit;}saprfc_import ($fce,"P_UNAME","demo-china");
saprfc_table_init ($fce,"T_LOG");
// Call and execute the function
$rc = saprfc_call_and_receive ($fce);
if ($rfc_rc != SAPRFC_OK){
if ($rfc == SAPRFC_EXCEPTION ){
echo ("Exception raised: ".saprfc_exception($fce));
} else {
echo ("Call error: ".saprfc_error($fce));
}
echo "failure";
exit;
}
$data_row = saprfc_table_rows ($fce,"T_LOG");
$log_msg='';
if($data_row != 0 || $data_row != '')
{
for ($i=1; $i<=$data_row; $i++)
{
$DATA = saprfc_table_read ($fce,"T_LOG",$i);
echo $DATA['MSGTX'];
if($DATA['MSGTY'] == "E")
{
$log_msg =$DATA['MSGTX'];
}
if($DATA['MSGNO'] == "D")
{
$log_msg ="D";
}
}
}
当它尝试打印 $DATA['MSGTX'] 时输出为 DEMO-CHINA ¥È###®Æ# ,如何获得准确的汉字。
提前致谢。
首先,您应该永远不要在任何编程语言中对字符characters/strings进行硬编码,尤其是在ABAP 中。在大多数情况下,SAP 系统是国际通用的多语言系统,因此在一种环境中硬编码的符号在另一种环境中可能会有不同的解释。在术语 environment 下,我指的是登录语言、用户参数等等。
因此我们不确切知道在调用您的 FM 期间如何处理文字,在这种情况下我们可以采取的可能步骤如下:
- 首先,将
CONCATENATE
语句中的文字转换为 text-symbol。文本符号是在 ABAP 中存储字符串的推荐方式。
那我建议你检查一下你的SAP系统是不是Unicode的。这可以通过 系统 > 状态 > Unicode 系统 菜单完成。您的系统不太可能是非 Unicode,但是,我们非常感谢您进行此项检查。
[可选] 此步骤是可选的,只有当您的系统是非 Unicode 时才有意义,但是无论如何它都会有用。通过语句
将您的环境代码页设置为中文
SET LOCALE LANGUAGE 1.
将语句放入 FM 的开头。
此外,确保在您的功能模块中启用 Unicode 系统检查也是明智的。为此,您应该转到 转到 > 主程序 > 转到 > 属性 并确保 Unicode 检查活动复选框 处于活动状态。
终于找到答案了。
$LOGIN = array ("ASHOST"=>$row_login1["sap_server"],
"SYSNR"=>$row_login1["sap_system_number"],
"CLIENT"=>$row_login1["sap_client"],
"USER"=>$row_login1["sap_username"],
"PASSWD"=>$row_login1["sap_password"],
"CODEPAGE"=>"4110");
CODEPAGE 从 8300 到 4110 解决了我的问题
我正在使用函数 module.i 通过 RFC 与 PHP 通信,试图将中文字符从功能模块发送到 PHP,但在 PHP 端我得到的是中文###### ,
形式的字符我不明白问题出在哪一方,PHP 一方还是 SAP 一方? 任何人都给我建议我需要关注哪一边来纠正这个问题?或任何其他方式将中文字符发送到 PHP?
SAP FM Code:FN 姓名:ZMM_PHP_TO_SAP
t_log-msgty = 'E'.
CONCATENATE p_uname '用户无检料权限' INTO t_log-msgtx SEPARATED BY space.
APPEND t_log.
PHP代码:
$LOGIN = array ("ASHOST"=>$row_login1["sap_server"],
"SYSNR"=>$row_login1["sap_system_number"],
"CLIENT"=>$row_login1["sap_client"],
"USER"=>$row_login1["sap_username"],
"PASSWD"=>$row_login1["sap_password"],
"CODEPAGE"=>"8300");
$rfc = saprfc_open ($LOGIN);
if(!$rfc){
$error=saprfc_error();
return "The RFC connection has failed with the following error:".saprfc_error();
exit;}
$fce = saprfc_function_discover($rfc,"ZMM_PHP_TO_SAP");
if(!$fce){
return "The function module has failed.";
return $rfc;
exit;}saprfc_import ($fce,"P_UNAME","demo-china");
saprfc_table_init ($fce,"T_LOG");
// Call and execute the function
$rc = saprfc_call_and_receive ($fce);
if ($rfc_rc != SAPRFC_OK){
if ($rfc == SAPRFC_EXCEPTION ){
echo ("Exception raised: ".saprfc_exception($fce));
} else {
echo ("Call error: ".saprfc_error($fce));
}
echo "failure";
exit;
}
$data_row = saprfc_table_rows ($fce,"T_LOG");
$log_msg='';
if($data_row != 0 || $data_row != '')
{
for ($i=1; $i<=$data_row; $i++)
{
$DATA = saprfc_table_read ($fce,"T_LOG",$i);
echo $DATA['MSGTX'];
if($DATA['MSGTY'] == "E")
{
$log_msg =$DATA['MSGTX'];
}
if($DATA['MSGNO'] == "D")
{
$log_msg ="D";
}
}
}
当它尝试打印 $DATA['MSGTX'] 时输出为 DEMO-CHINA ¥È###®Æ# ,如何获得准确的汉字。 提前致谢。
首先,您应该永远不要在任何编程语言中对字符characters/strings进行硬编码,尤其是在ABAP 中。在大多数情况下,SAP 系统是国际通用的多语言系统,因此在一种环境中硬编码的符号在另一种环境中可能会有不同的解释。在术语 environment 下,我指的是登录语言、用户参数等等。
因此我们不确切知道在调用您的 FM 期间如何处理文字,在这种情况下我们可以采取的可能步骤如下:
- 首先,将
CONCATENATE
语句中的文字转换为 text-symbol。文本符号是在 ABAP 中存储字符串的推荐方式。 那我建议你检查一下你的SAP系统是不是Unicode的。这可以通过 系统 > 状态 > Unicode 系统 菜单完成。您的系统不太可能是非 Unicode,但是,我们非常感谢您进行此项检查。
[可选] 此步骤是可选的,只有当您的系统是非 Unicode 时才有意义,但是无论如何它都会有用。通过语句
将您的环境代码页设置为中文SET LOCALE LANGUAGE 1.
将语句放入 FM 的开头。
此外,确保在您的功能模块中启用 Unicode 系统检查也是明智的。为此,您应该转到 转到 > 主程序 > 转到 > 属性 并确保 Unicode 检查活动复选框 处于活动状态。
终于找到答案了。
$LOGIN = array ("ASHOST"=>$row_login1["sap_server"],
"SYSNR"=>$row_login1["sap_system_number"],
"CLIENT"=>$row_login1["sap_client"],
"USER"=>$row_login1["sap_username"],
"PASSWD"=>$row_login1["sap_password"],
"CODEPAGE"=>"4110");
CODEPAGE 从 8300 到 4110 解决了我的问题