مرکز آموزش

صفحه اصلی پورتال > مرکز آموزش > هاستینگ > Scripts > روش کلی رفع مشکل نمایش ؟؟؟؟ در اسکریپت ها


روش کلی رفع مشکل نمایش ؟؟؟؟ در اسکریپت ها




پیرو مشکل اخیر یکی از کاربران که کلیه اسکریپت هایش که از سرور دیگری به سرور ما منتقل کرده بود مشکل انکودینگ داشت و به دلیل واضح شدن این مساله این پست را می نویسم : 
به طور کلی در دیتابیس ها بر حسب استانداردهای مختلف مربوط به زبان ها و کاراکترهای خاص هر زبان ( مثل فونت فارسی چینی و ژاپنی و آلمانی و ... ) استانداردهای مختلفی تعریف شده است که هر کدام مزایا و معایب خاص خودشان را دارند و مهم ترین نقش آنها درست نمایش داده شدن کاراکترها و همچنین بهبود کارایی دیتابیس برای یک زبان خاص می باشد . 
اسکریپت های قدیمی عموما با دیتابیس های latin1 , collation = latin1_general_ci کار می کردند . بعد ، از 4 5 سال پیش وب به سمت یکسان سازی استانداردها حرکت کرده و برای مثال بزرگترین CMS وردپرس استاندارد utf8 , collation = utf8_general_ci را برای این اسکریپت عمومی کرده است . 
تا قبل از این برای زبان هایی مثل فارسی ، برای مثال در نسخه های nuke 7  و قدیمی تر ، دیتابیس ها و جداول لاتین بودند اما درخواست های ارسالی به آن utf8 بودند . که این از عملکرد بهینه سرور می کاست و زمانی که درخواستی به سرور برای نمایش یک صفحه سایت ارسال می شد علاوه بر کوئری مربوط به سرچ ، یک پروسس هم برای تغییر انکودینگ در صفحات رخ می داد. که برای مثال از نسخه نیوک فارسی 8 به بعد اسکریپت با جداول استاندارد شده utf8 , collation=utf8_persian_ci , ya utf8_general_ci ارائه شدند. 
عیب دیگری که روش قدیمی داشت این بود که دیتا داخل جداول به طور خوانا ذخیره نمی شد و باید با تتظیمات خاص در Phpmyadmin , show BLOB data , آنها را در صورت امکان قابل خواندن و ویرایش می کردیم . 
برای مثال در دیتابیس تراوین قدیمی : 
'آبادی تسخیر نشده'  در جداول لاتین به صورت 'آبادی تسخیر نشده'  ذخیره می شوند ! و بعد در صفحات با قراردادن کد زیر در هدر صفحه با استاندارد utf8 نمایش داده می شود.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

که برای رفع این مشکل و استاندارد سازی اطلاعاتی که از قبل در دیتابیس وجود دارد باید یک فرایند زمانبر تبدیل کلیه اطلاعات موجود در دیتابیس به باینری و سپس تغییر جداول و خود دیتابیس به utf8 و سپس برگرداندن تبدیل دیتا باینری BLOB , Binary شده به فرمت و انکود نهایی utf8 را طی کرد که مراحل آن را می توانید در لینک زیر مشاهده نمایید :
http://www.varesano.net/blog/fabio/latin1%20encoded%20tables%20or%20databases%20utf8%20data%20stored%20convert%20them%20native%20mysql%20utf8%20tables
Submitted by fabio on Thu, 2007-08-02 01:42.

http://codex.wordpress.org/Converting_Database_Character_Sets
که گفته که وردپرس از نسخه 2.2 به استانداردسازی دیتابیس رو آورده و utf8 را پیاده سازی کرده است. 
 

The History

Up to and including WordPress Version 2.1.3, most WordPress databases were created using the latin1 character set and the latin1_swedish_ci collation.

Beginning with Version 2.2, both the database character set and the collation can be defined in the wp-config.php file. Setting the DB_CHARSET and DB_COLLATE values inwp-config.php causes WordPress to create the database with the appropriate charset settings. The default is UTF8, the standard charset for modern data which supports all internet-friendly languages.




که من در سال 2009 در زمانی که در تیم نیوک اوولوشن قبل از اینکه نیوک مشهد تیم نسخه Ajax شده 8 را ارائه کند این استاندارد سازی را برای نیوک اوولوشن پیاده کرده بودم. و همکارمان ( بهرام ) اینستالر و به روز رسانی کننده دیتابیس های قدیمی را هم برای کاربران nuke evo نوشت. 

Example steps:

  1. Place notice that blog is out of service
  2. Backup database
  3. ALTER TABLE wp_users MODIFY display_name BLOB;
  4. ...ALTER TABLE commands for all other tables/columns...
  5. ALTER DATABASE wordpress charset=utf8;
  6. ALTER TABLE wp_users charset=utf8;
  7. ...ALTER TABLE command for all other tables...
  8. ALTER TABLE wp_users MODIFY display_name TEXT CHARACTER SET utf8;
  9. ...ALTER TABLE for all other tables/columns...
  10. Add DB_CHARSET and DB_COLLATE definitions to wp-config.php
  11. Place blog back on-line

The string field types need to be converted to their binary field types counterparts. The list is as follows:

  • CHAR -> BINARY
  • VARCHAR -> VARBINARY
  • TINYTEXT -> TINYBLOB
  • TEXT -> BLOB
  • MEDIUMTEXT -> MEDIUMBLOB
  • LONGTEXT -> LONGBLOB 


می توانیم در سرورها با قراردادن کدهای زیر در تنظیمات mysql server پیش فرض کلیه اتصالات به دیتابیس ها ، جدول ها و کوئری های ارسالی به جداول را force utf8 تنظیم کنیم اما در این صورت اسکریپت های قدیمی مثل نیوک های قدیمی و وردپرس و جوملا های قدیمی اطلاعاتشان به صورت تبدیل نشده و ناخوانا ( مثل مثال بالا ) در صفحه نمایش داده خواهند شد تا زمانی که اطلاعاتشان را استاندارد سازی کنند . 

#character-set-server=utf8
#collation-server=utf8_general_ci
#init-connect='SET NAMES utf8'


بعد از استانداردسازی اطلاعات داخل دیتابیس نوبت به اصلاح اتصال استاندارد اسکریپت به دیتابیس توسط کدهای مانند زیر هست : 
مثلا کد مربوط به دیتابیس نیوک 8.2 :

$dbi=@mysql_connect($host, $user, $password);
mysql_query("SET NAMES 'utf8'", $dbi);
mysql_query("SET CHARACTER_SET utf8", $dbi);

بعد از این مرحله باید خود فایل های اسکریپت ها و فایل های زبان و فایل های قالب با فرمت utf8 ذخیره شوند . 
برای اینکار بهترین برنامه پیشنهادی ما دانلود و استفاده از برنامه ++NotePad  می باشد ( نه خود notepad ویندوز ! ) 
که فایل ها را تک به تک با برنامه notepad++ باز می کنید و از منوی encoding --> convert to utf8 , ya convert to utf8 without BOM ( latin1 as utf8 ) save و آپلود می کنیم . 


نمونه نمایش اطلاعات utf8 ذخیره شده به اشتباه در جداول latin1 :  


نمایش اطلاعات utf8 در جداول latin1


 

نمونه نمایش اطلاعات utf8 با انکودینگ اشتباه نمایش در صفحات به صورت  ansi , win1252 , latin1 :  


نمونه نمایش اطلاعات utf8 با انکودینگ اشتباه نمایش در صفحات به صورت  ansi , win1252 , latin1 :

 

نمونه نمایش اطلاعات utf8 که به درستی در جداول utf8 شده ذخیره شده باشند :  

 

نمونه نمایش اطلاعات utf8 که به درستی در جداول utf8 شده ذخیره شده باشند


نمونه نمایش اطلاعات دیتابیس و جداول لاتین قبل از استانداردسازی utf8 :  

 

جداول لاتین قبل از استانداردسازی utf8



نمونه نمایش دیتابیس و جداول utf8 که به درستی utf8 شده ذخیره شده باشند :  

 

نمونه نمایش دیتابیس و جداول utf8 که به درستی utf8 شده ذخیره شده باشند


نمونه نمایش فیلدهای داخل جداول قبل از استانداردسازی utf8 :  

 

فیلدهای داخل جداول قبل از استانداردسازی utf8



نمونه نمایش فیلدهای داخل جداول بعد از استانداردسازی utf8 که به درستی در جداول utf8 شده ذخیره شده باشند :  

 

نمونه نمایش فیلدهای داخل جداول بعد از استانداردسازی utf8 که به درستی در جداول utf8 شده ذخیره شده باشند


نمونه نمایش اطلاعات utf8 که به اشتباه در جداول latin1 ذخیره شده باشند :  

 مونه نمایش اطلاعات utf8 که به درستی در جداول utf8 شده ذخیره شده باشند




نمونه نمایش اطلاعات utf8 که به درستی در جداول utf8 شده ذخیره شده باشند :  

 

مونه نمایش اطلاعات utf8 که به درستی در جداول utf8 شده ذخیره شده باشند
 
 
 
 
امیدوارم این نوشته در روشن شدن ذهن شما نسبت به مشکل نمایش ؟؟؟؟ در سایتتان کمک کند . 
آخرین به روز رسانی : 1393.05.03



آیا این پاسخ مفید بود؟

افزودن به علاقه مندی ها افزودن به علاقه مندی ها    چاپ این مقاله چاپ این مقاله

خوانده شده
Avoid Meta Charset Tag for IE8 (بازدید: 1450)

زبان: