ايران ويج

نسخه‌ی کامل: مشکل با یونیکد
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام .

جدیدا با یه مشکلی مواجه شدم که نتونستم حلش کنم .
من از یک شرکتی اس ام اس پنل گرفتم برای ارسال ودریافت پیامک از طریق وب سرویس .

تا به دیروز که فقط قضیه ارسال بود هیچ مشکلی نبود ولی از دیروز که مسئله دریافت اومده جلو مشکلی پیدا شده با کاراکتر های غیر انگلیسی (کد های غیر اسکی) .

وقتی به پنل پیامک میزنم "بله" تو خود پنل به درستی نشون داده میشه ولی وقتی با تابعی که توی وب سرویسشون ارائه کردن متن پیامک رو میخونم اینجوری بهم تحویل میده "بله Ù" که کد های هگز این عبارت هست :
کد:
00D8 00A8 00D9 0084 00D9 0087 0020 00D9
که اگر همین کد های هگز رو تبدیل به UTF-8 کنیم میشه "بله"
این بررسی رو اینجا انجام دادم .

اینکودینگ وب سرویس رو هم UTF-8 انتخاب کردم (در غیر اینصورت اصلا به وب سرویس وصل نمیشه)

خود شرکت پنل پیامک هم نتونست راهنمایی کنه .

نکته ای که برام خیلی عجیب بود اینه که این کد ها روی لوکال سیستم خودم به درستی کار میکنن و مقدار دریافتی از وب سرویس رو درست نشون میدن ولی وقتی آپلود میکنم روی سرور این مشکل بوجود میاد و توی دریافت و حتی ذخیره متن یونیکد تو دیستابیس همه چیز بهم میریزه .


دوستان قبلا با همچین موردی روبرو شدن ؟ میدونین قضیه چیه و راه حلی داره یا نه ؟
نمیدونم میتونه کمک کنه یا نه؛ ولی اگه کمک نکرد بیشتر از ۲۰٪ اخطار ندینا Biggrin

قضیه اینکه استانداردی که توی sms وجوذ داره یونیکد (utf-8) نیست! از استاندارد UCS-2 استفاده میکنه!

علی‌الحساب شما وقتی متن رو دریافت میکند با تابع iconv کدینگ رشته رو عوض کنید و به utf-8 تغییرش بدید؛ ببینید درست میشه یانه

برای مثال اینطور (منبع لینک دو)
کد php:
iconv('UCS-2''UTF-8'$string

اینا هم شاید بتونه کمک کنه - لینک یک ؛ لینک دو
سلام .
دستت درد نکنه .
درسته که استاندارد اینکودینگ پیامک ها فرق داره ولی اینجایی که من متن پیامک رو دریافت میکنم از دیتابیس پنل پیامک هست که اونجا بصورت UTF-8 ذخیره شده .

و همنوطور که گفتم روی لوکال سیستم خودم بدرستی دریافت ،نمایش و ذخیره میشن ولی روی سرور قضیه فرق داره و این مشکلات عجیب غریب بوجود میاد .
-
این کدی هم که دادی بدیها جواب نداد که هیچ زد پوکوند Biggrin

نقل قول: ㄱ㈰㔸ㄳ⭾㠹㈹㐱㔴ㄳ㈴㥾〳㈴㄰㐵縶鯃냂
آقا من یه مشکلی با مد هگزی که گذاشتید دارم!‌ (یعنی از همون روز درگیرم Biggrin)

این کدی که گذاشتید چرا چهار رقمی هستش؟! اون 00 اول هر کد هگز چکارست؟
اون کد هگز رو برنامه‌های HEX‌ (توی لینوکس) نمیتونن تشخیص بدن! ولی وقتی 00 های اولشو پاک میکنم به راحتی عبارت رو نشنون میده..


حالا چند تا سوال پیش میاد؛

یکیش اینکه اصلا چرا ۴ رقمه هست اون کد هگز؟ (۴ رقمه بودن یعنی D8 هیجویت به A8 نمیچسبه که حرف "ب" تولید بشه!!! )

سوال بعدی اینه که؛ میشه اینتطور نتیجه گرفت که شما توی ویندوز دارید تست میکنید کدتون رو جواب میگیرید در حالی که سرورتون لینوکسه و شاید با این نوع کد هگز مشکل داره (مثل سیستم من!!)

(۲۱-تير-۱۳۹۳, ۰۶:۱۹:۱۱)hamed_Arfaee نوشته است: [ -> ]درسته که استاندارد اینکودینگ پیامک ها فرق داره ولی اینجایی که من متن پیامک رو دریافت میکنم از دیتابیس پنل پیامک هست که اونجا بصورت UTF-8 ذخیره شده .

فکرم این بود که شاید به همون صورتی که دریافت شدن ذخیره کردن و تحویل api‌ میدن Biggrin
(۲۰-تير-۱۳۹۳, ۱۸:۵۲:۲۴)hamed_Arfaee نوشته است: [ -> ]
کد:
00D8 00A8 00D9 0084 00D9 0087 0020 00D9
که اگر همین کد های هگز رو تبدیل به UTF-8 کنیم میشه "بله"
این بررسی رو اینجا انجام دادم .

این کد ها utf-8 نیستند!

الان شما توی همون سایته که معرفی کردید؛ همین عبارتی "بله Ù" که گفتید رو دوباره تست کنید؛ اینبار قسمت utf-16 رو ببینید ؛ مقدارش برابر با همون مقدار "بله" در کدینگ UTF-8 هست!

پس اگه بتونیم این کدها رو به utf-16 تبدیل کنیم؛ بعدش متونیم با تابع pack اون تبدیل به متن "بله" کنیم!!

الان مشکل اینه که نمیشه به هیچ طریقی توی php متن رو تبدیل کرد به "D8 A8 D9 84 D9 87 20 D9" !!‌ هرکار کردم هر کد رو ۲ بایتی با 00 اولش چاپ میکنه!!

Biggrin کلا حس میکنم خودمم نمیفهمم چی دارم میگم Biggrin
سلام .

دستت درد نکنه وقت گذاشتی، بالاخره امروز فرصت کردم خودمم روش کار کنم .
نمیدونم جز این راه حل دیگه ای هست یا نه ؟!
نقل قول: بله Ù
اول با کد زیر جملرو به کد هگز یو تی اف 8 تبدیل کردم :
کد php:
function utf8_to_unicode$str ) {
        
        
$unicode = array();        
        
$values = array();
        
$lookingFor 1;
        
        for (
$i 0$i strlen$str ); $i++ ) {

            
$thisValue ord$str$i ] );
            
            if ( 
$thisValue 128 $unicode[] = $thisValue;
            else {
            
                if ( 
count$values ) == $lookingFor = ( $thisValue 224 ) ? 3;
                
                
$values[] = $thisValue;
                
                if ( 
count$values ) == $lookingFor ) {
            
                    
$number = ( $lookingFor == ) ?
                        ( ( 
$values[0] % 16 ) * 4096 ) + ( ( $values[1] % 64 ) * 64 ) + ( $values[2] % 64 ):
                        ( ( 
$values[0] % 32 ) * 64 ) + ( $values[1] % 64 );
                    
$unicode[] = '0x'.dechex($number);
                    
$values = array();
                    
$lookingFor 1;
            
                } 
// if
            
            
// if
            
        
// for

        
return $unicode;
    
    } 
// utf8_to_unicode 
خروجی که این که این شکلی میشه :
نقل قول: 0xd8
0xa8
0xd9
0x84
0xd9
0x87
با تابع pack به این صورت :
کد php:
echo pack("nvc*"0xd8,0xa8,0xd9,0x84,0xd9,0x87); 
تبدیل به نوشته فارسی شد
نقل قول: بله
ولی الان یه چیزی که هست باید خروجی تابع کد هگز به تابع pack ارسال بشه .
اینم اینشکلی انجامش دادم :
کد php:
$a=utf8_to_unicode($binary);
echo 
call_user_func_array("pack",$a); 
و خط دوم تابع رو اینجوری تغییر دادم:
کد php:
$unicode = array("nvc*"); 
ولی جواب نداد و خروجی شد 8 تا نال.
فرصت نشد بیشتر از این روش وقت بذارم .
بنظرت مشکلش کجاس ؟
آقا حامد متوجه نشدم سوالتون رو! و اینکه مشکلتون کجاست! یکم بیشتر اگه میشه توضیح بدید

--------

ولی من به نتیجه رسیدم با کد زیر؛ همون راه حل بالایی رو رفتم و اینبار بایت‌های NULL رو حذف کردم؛

کد php:
echo  str_replace("\0","",iconv('utf8','ucs2',$string)); 

اول کدینگ رشته رو عوض کردم و بعد تمام null بایت‌ها رو (که میشه 00) رو حذف کردم!!

من روی همین کلمه "بله Ù" تست کردم؛ و جواب شد "بله" ؛ شما هم یه تست بزنید ببینید چواب میده؟؟
سلام
دستت درد نکنه .
همینه .
جالبه بعضی کد ها رو ویندوز جواب نمیدن ولی رو لینوکس کار میکنن .