קידוד

אותיות מקודדות במערכות באמצעות טבלאות קידוד שונות. ASCII ו EBCDIC הם שני קידודים מוקדמים שהתבססו על תו בעל 7-8 ביטים. קידודים מאוחרים יותר משתמשים ב 1-4 בתים לייצוג אות, בסביבות בהם נרצה להשתמש בכמה שפות ואולי גם בסימנים מיוחדים אחרים. הנושא עשוי להיות מסובך, היות שכל שדה בבסיס הנתונים יכול להיות בקידוד אחר.

ויקיפדיה: UTF-8 (ראשי תיבות של 8-bit Unicode Transformation Format או 8-bit UCS Transformation Format) הוא קידוד תווים באורך משתנה ליוניקוד, שנוצר על ידי רוב פייק וקן תומפסון. ניתן לקודד בו כל תו המצוי בתקן יוניקוד על ידי שימוש באחד עד ארבעה בתים, תלוי בתו. הקידוד ב-UTF-8 מעניק את כל יתרונות השימוש בקידוד ליוניקוד ומוסיף עליהם, בין היתר, גם חיסכון בזיכרון, עמידות בפני איבוד או השחתת בתים ותאימות לאחור ל-ASCII. ה-IETF מעדיף בבירור את UTF-8 ומחייב כל פרוטוקול אינטרנט לתמוך בו, וכן קונסורציום הדואר האלקטרוני, ה-IMC, ממליץ שכל תוכנת דואר אלקטרוני תוכל להציג וליצור דואר באמצעות UTF-8.

באופן עקרוני נרצה שכל המערכת תהיה בקידוד אחד, למשל UTF8. זה מפשט את פיתוח התוכנה ותחזוקת בסיס הנתונים.

he Latin-1 Supplement (also called C1 Controls and Latin-1 Supplement) is the second Unicode block in the Unicode standard. It encodes the upper range of ISO 8859-1: 80 (U+0080) – FF (U+00FF). Controls C1 (0080–009F) are not graphic. This block ranges from U+0080 to U+00FF, contains 128 characters and includes the C1 controlsLatin-1 punctuation and symbols, 30 pairs of majuscule and minuscule accented Latin characters and 2 mathematical operators.

מומלץ להגדיר בעת יצירת המערכת את השורה

define( 'DB_CHARSET', 'utf8' );

או

define( 'DB_CHARSET', 'utf8mb4' );

רצה הגורל והאתר הנוכחי התחיל בקידוד latin1, בעוד שחלק מהטבלאות המידע נוצרו בקידוד utf8. מתוך רצון להרחיב את גמישות הפלאגינים, חיפשתי דרך לתמוך בשליפת נתונים משני הקידודים.

עד כה היה שימוש בפונקציה שבוצע באתחול של הפלאגין.

mysqli_set_charset( $conn, 'utf8' );

כעת, נדרשת לבצע את הפקודה הזאת, רק במקרה והטבלה אינה בקידוד ברירת המחדל.

לבצע זאת, רגע לפני, באחת מפקודות ה SQL דורש לפרסר את הפקודה כדי להבין על איזה טבלה מדובר. אבל אחרת יהיה צורך בשינוי בפקודות רבות. נחפש בשורת ה SQL את המילה From והמילה הבאה תהיה שם הטבלה.

function GetTableEncoding($table) {
static $cache = null;
if ( isset( $cache[ $table ] ) ) return $cache[ $table ];
if ( ! $cache ) $cache = [];
$cache[$table] = SqlQuerySingleScalar("SELECT CCSA.character_set_name FROM information_schema.TABLES T,
information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_name = '$table'", false, false);
return $cache[$table];
// AND T.table_schema = \"schemaname\"


}

function SqlSetEncoding($conn, $sql)
{
$from_pos = strpos(strtolower($sql), " from ");
if (! $from_pos) return;
$table_name = strtok(substr($sql, $from_pos + 6), " ");

mysqli_set_charset($conn, GetTableEncoding($table_name));

}



כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *