0

我正在使用函数模块通过 RFC 与 PHP 通信。我尝试将中文字符从函数模块发送到 PHP,但在 PHP 端,我以 ###### 的形式获取中文字符,

我不明白问题出在哪一边,PHP 端还是 SAP 端?任何人都给我建议我需要关注哪方面来纠正这个问题?或任何其他方式将汉字发送到PHP?

SAP FM 代码: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 ¥Î###®Æ# ,如何获得准确的汉字。提前致谢。

4

2 回答 2

1

终于找到答案了。

$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 解决了我的问题

于 2019-07-10T08:45:24.197 回答
0

首先,你不应该任何编程语言中硬编码字符/字符串,尤其是在 ABAP 中。在大多数情况下,SAP 系统是国际通用的多语言系统,因此在一种环境中硬编码的符号在另一种环境中可能会有不同的解释。在术语环境下,我的意思是登录语言、用户参数等等。

因此,我们不确切知道在调用 FM 期间如何处理文字,在这种情况下我们可以采取的可能步骤如下:

  1. 首先,将您的文字 inCONCATENATE语句转换为text-symbol。文本符号是在 ABAP 中存储字符串的推荐方式。
  2. 那我建议你检查一下你的 SAP 系统是不是 Unicode。这可以通过系统 > 状态 > Unicode 系统菜单来完成。您的系统不太可能是非 Unicode,但是,我们非常感谢您进行此检查。

  3. [可选]此步骤是可选的,仅当您的系统是非 Unicode 时才有意义,但无论如何它都会很有用。通过语句将您的环境代码页设置为中文

    SET LOCALE LANGUAGE 1.
    

    将声明放在 FM 的开头。

  4. 确保在您的功能模块中启用 Unicode 系统检查也是明智的。为此,您应该转到 > 主程序 > 转到 > 属性并确保Unicode 检查活动复选框处于活动状态。

于 2016-02-15T12:12:59.780 回答