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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: kaija_jan at hotmail dot com
New email:
PHP Version: OS:

 

 [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

Pull Requests

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-2025 The PHP Group
All rights reserved.
Last updated: Thu Mar 13 21:01:32 2025 UTC