php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #28117 chinese comparision in delphi 5 COM object
Submitted: 2004-04-23 07:30 UTC Modified: 2005-01-26 07:01 UTC
From: kaija_jan at hotmail dot com Assigned:
Status: Closed Package: COM related
PHP Version: 5.0.0RC1 OS: windows 2k
Private report: No CVE-ID: None
 [2004-04-23 07:30 UTC] kaija_jan at hotmail dot com
Description:
------------
I wrote a COM object by using delphi 5.
It do some comparision in the delphi object like the following code.
====================================================
function Ttest.comparestr(const a, b: WideString; c,
  d: OleVariant): OleVariant;
var
    e : widestring;
    r : olevariant;
begin
    e := '中文';
    r := '';

    if a = b then
        r := r + 'a=b<br>'
    else
        r := r + 'a<>b<br>';

    if c = d then
        r := r + 'c=d<br>'
    else
        r := r + 'c<>d<br>';

    if a = c then
        r := r + 'a=c<br>'
    else
        r := r + 'a<>c<br>';

    if a = e then
        r := r + 'a=e<br>'
    else
        r := r + 'a<>e<br>';

    if c = e then
        r := r + 'c=e<br>'
    else
        r := r + 'c<>e<br>';

    result := r;
end;
====================================================

It always shows a<>e and c<>e(others equal) when I use PHP COM funcion, and do chinese comparision. But It prints all equal if I send pure english words or some numeral vairants.
And It shows all equal while I using asp to call the COM object, whatever I send chinese or english.

Reproduce code:
---------------
<?php
    $a = $b = $c = $d = "中文"; //some chinese words

    $comtest = new COM("comtest.test1");

    echo $comtest->comparestr($a, $b, $c, $d);

    unset($comtest);
?>

php outputs:
a=b
c=d
a=c
a<>e
c<>e

=================================
<%
    a = "中文" 'some chinese words
    b = a
    c = a
    d = a

    set comtest = server.createobject("comtest.test1")

    response.write comtest.comparestr(a, b, c, d)

    set comtest = nothing
%>

asp outputs:
a=b
c=d
a=c
a=e
c=e

Expected result:
----------------
output:
a=b
c=d
a=c
a=e
c=e

Actual result:
--------------
output:
a=b
c=d
a=c
a<>e
c<>e

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-04-23 08:32 UTC] wez@php.net
You need to tell COM that the text is chinese.
There are two ways to achieve this:

set com.code_page ini setting to the number corresponding to chinese (this is the default code_page used by PHP--the default is CP_ACP), or set the code_page in the third parameter of the COM constructor:

$obj = new COM("comtest.test1", null, $codepage);

PHP defines these constants for codepages; they can be
used both in your scripts and in the php.ini:

CP_ACP
CP_MACCP
CP_OEMCP
CP_UTF7
CP_UTF8
CP_SYMBOL
CP_THREAD_ACP

You can use the numeric value for the chinese code page directly if you know it (you probably want 950 or 936).  Consult MSDN for more information:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/act/htm/actml_ref_scpg.asp


 [2004-04-23 09:13 UTC] kaija_jan at hotmail dot com
$obj = new COM("comtest.test1", null, 950);

I got the same result after I modify the codepage parameter.
======================
a=b
c=d
a=c
a<>e
c<>e
======================

And I tried each codepage under.
CP_ACP, CP_MACCP, CP_OEMCP, CP_UTF7, CP_UTF8, CP_SYMBOL, 
CP_THREAD_ACP

I also tried the same code in PHP 4.3.6(It crashes php in 4.3.4), It gives me the same result as PHP 5 RC1.
 [2004-04-23 09:53 UTC] wez@php.net
Could you please adjust your COM object to return e instead, and paste the output of this script here?

<?php
    $a = $b = $c = $d = "中文"; //some chinese words
    $comtest = new COM("comtest.test1");
    $e = $comtest->comparestr($a, $b, $c, $d);
    echo "d is " . bin2hex($d) . "\n";
    echo "e is " . bin2hex($e) . "\n";
?>

 [2004-04-23 10:26 UTC] kaija_jan at hotmail dot com
It's output the same in this case.
I had tried this way.
And I also tried to print out each byte of "e" and "d"(even a) in the DELPHI COM Object.

*It's different between e and d(or a).*

It's the same if you try to return the string from the Object. But It's different in the object.
This problem confused me for a long time.

Notice : I'm not sure if it is the same result in Visual C++ COM.(Delphi COM crashed php, but VC COM didn't.) I'm not a good C programmer :(. I can't help you about this.

=========================
output:
d is a4a4a4e5
e is a4a4a4e5
=========================
 [2004-04-28 09:31 UTC] wez@php.net
Are you running CGI, CLI, IIS or Apache module ?

 [2004-04-28 09:38 UTC] kaija_jan at hotmail dot com
iis 5 and apache 2
if you need hex output in delphi com, i can show it to you
and if u need the delphi com project, i will send it for you.
 [2005-01-26 04:53 UTC] sniper@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip


 [2005-01-26 07:01 UTC] kaija_jan at hotmail dot com
thx for reply
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Sat Jul 04 19:01:16 2020 UTC