امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 3
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با یونیکد
نویسنده پیام
hamed_Arfaee آفلاین
مدیر بخش
*****

ارسال‌ها: 1,334
موضوع‌ها: 231
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 1250
( 2634 تشکر در 730 ارسال )
ارسال: #1
مشکل با یونیکد
سلام .

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

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

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

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

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

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


دوستان قبلا با همچین موردی روبرو شدن ؟ میدونین قضیه چیه و راه حلی داره یا نه ؟

حامد ارفعی

موفقيت، پيش رفتن است، نه به نقطه ي پايان رسيدن.(آنتوني رابينز)


تریگرها در SQL server

آیا میدانید SQL ای
۲۰-تير-۱۳۹۳, ۱۸:۵۲:۲۴
وب سایت ارسال‌ها
پاسخ
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #2
RE: مشکل با یونیکد
نمیدونم میتونه کمک کنه یا نه؛ ولی اگه کمک نکرد بیشتر از ۲۰٪ اخطار ندینا Biggrin

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

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

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

اینا هم شاید بتونه کمک کنه - لینک یک ؛ لینک دو
(آخرین ویرایش در این ارسال: ۲۰-تير-۱۳۹۳, ۲۰:۴۸:۳۷، توسط babyy.)
۲۰-تير-۱۳۹۳, ۲۰:۴۲:۲۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : Ghoghnus, hamed_Arfaee, رسول
hamed_Arfaee آفلاین
مدیر بخش
*****

ارسال‌ها: 1,334
موضوع‌ها: 231
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 1250
( 2634 تشکر در 730 ارسال )
ارسال: #3
RE: مشکل با یونیکد
سلام .
دستت درد نکنه .
درسته که استاندارد اینکودینگ پیامک ها فرق داره ولی اینجایی که من متن پیامک رو دریافت میکنم از دیتابیس پنل پیامک هست که اونجا بصورت UTF-8 ذخیره شده .

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

نقل قول: ㄱ㈰㔸ㄳ⭾㠹㈹㐱㔴ㄳ㈴㥾〳㈴㄰㐵縶鯃냂

حامد ارفعی

موفقيت، پيش رفتن است، نه به نقطه ي پايان رسيدن.(آنتوني رابينز)


تریگرها در SQL server

آیا میدانید SQL ای
۲۱-تير-۱۳۹۳, ۰۶:۱۹:۱۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #4
RE: مشکل با یونیکد
آقا من یه مشکلی با مد هگزی که گذاشتید دارم!‌ (یعنی از همون روز درگیرم Biggrin)

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


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

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

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

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

فکرم این بود که شاید به همون صورتی که دریافت شدن ذخیره کردن و تحویل api‌ میدن Biggrin


فایل‌(های) پیوست شده بندانگشتی (ها)
   
(آخرین ویرایش در این ارسال: ۲۴-تير-۱۳۹۳, ۰۴:۲۲:۵۲، توسط babyy.)
۲۴-تير-۱۳۹۳, ۰۴:۰۸:۱۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hamed_Arfaee, رسول
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #5
RE: مشکل با یونیکد
(۲۰-تير-۱۳۹۳, ۱۸:۵۲:۲۴)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
۲۴-تير-۱۳۹۳, ۰۶:۵۵:۴۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hamed_Arfaee, رسول
hamed_Arfaee آفلاین
مدیر بخش
*****

ارسال‌ها: 1,334
موضوع‌ها: 231
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 1250
( 2634 تشکر در 730 ارسال )
ارسال: #6
RE: مشکل با یونیکد
سلام .

دستت درد نکنه وقت گذاشتی، بالاخره امروز فرصت کردم خودمم روش کار کنم .
نمیدونم جز این راه حل دیگه ای هست یا نه ؟!
نقل قول: بله Ù
اول با کد زیر جملرو به کد هگز یو تی اف 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 تا نال.
فرصت نشد بیشتر از این روش وقت بذارم .
بنظرت مشکلش کجاس ؟

حامد ارفعی

موفقيت، پيش رفتن است، نه به نقطه ي پايان رسيدن.(آنتوني رابينز)


تریگرها در SQL server

آیا میدانید SQL ای
۳۱-تير-۱۳۹۳, ۱۵:۱۹:۴۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : رسول
babyy آفلاین
بازنشسته
*****

ارسال‌ها: 3,095
موضوع‌ها: 141
تاریخ عضویت: مرداد ۱۳۸۷

تشکرها : 35081
( 26090 تشکر در 9068 ارسال )
ارسال: #7
RE: مشکل با یونیکد
آقا حامد متوجه نشدم سوالتون رو! و اینکه مشکلتون کجاست! یکم بیشتر اگه میشه توضیح بدید

--------

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

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

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

من روی همین کلمه "بله Ù" تست کردم؛ و جواب شد "بله" ؛ شما هم یه تست بزنید ببینید چواب میده؟؟
۳۱-تير-۱۳۹۳, ۲۲:۵۳:۴۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hamed_Arfaee, lord_viper
hamed_Arfaee آفلاین
مدیر بخش
*****

ارسال‌ها: 1,334
موضوع‌ها: 231
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 1250
( 2634 تشکر در 730 ارسال )
ارسال: #8
RE: مشکل با یونیکد
سلام
دستت درد نکنه .
همینه .
جالبه بعضی کد ها رو ویندوز جواب نمیدن ولی رو لینوکس کار میکنن .

حامد ارفعی

موفقيت، پيش رفتن است، نه به نقطه ي پايان رسيدن.(آنتوني رابينز)


تریگرها در SQL server

آیا میدانید SQL ای
۰۱-مرداد-۱۳۹۳, ۰۲:۵۷:۵۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS