เข้ารหัสตัวอักษรในอดีต

ในอดีตคนไทยที่เขียนเว็บเพจ
จะใช้ charset เป็น tis-620
หรือ windows-874 หรือ iso-8859-11
ส่วนแฟ้มเว็บเพจ
มีการเข้ารหัสแบบ ansi
คือ 1 ตัวอักษร = 1 ไบท์

ปัจจุบันการเข้ารหัสตัวอักษร
จะใช้ utf-8 ซึ่งรองรับได้เกือบทุกภาษา
และเครื่องมือต่าง ๆ ก็ใช้ utf-8
แต่ตัวอักษรที่ไม่ใช่ภาษาอังกฤษ
จะใช้พื้นที่ในการเขียนเว็บเพจ
หรือการเก็บข้อมูลมากกว่า 1 byte
เช่น ก จะใช้พื้นที่ 3 byte
เปลี่ยนจาก A1 ฐาน 16 ในตาราง ascii
เป็น E0B881 ฐาน 16 ใน UTF-8

เว็บเพจเดิม
ใช้ windows-874 และเข้ารหัสแบบ ansi
แต่เครื่องบริการกำหนด default
ให้ charset เป็น utf-8
ทำให้ต้องกลับไปแก้ไขเว็บเพจทั้งหมด
เนื่องจากพัฒนาเว็บเพจเป็นแบบ static
ทำให้ต้องตามกลับไปแก้ไขทุกแฟ้ม

ถ้าระบบใดพัฒนาเป็นแบบ dynamic
มีการแยก header ให้ include เข้าไป
ก็จะแก้ไขได้โดยง่าย

ซึ่งข้อดีข้อเสียของ
ทั้ง dynamic และ static ก็ต่างกันไป
เช่นเดียวกับระบบรวมศูนย์
และกระจายศูนย์ ที่อยู่ระบบใด
ก็จะเห็นข้อดีของระบบอื่น
และต้องการเปลี่ยนแปลงอยู่เสมอ

https://thaiall.com/fonts/[:])
Font
ปรับปรุง charset

น้องวงศ์แชร์แนวคำถาม ในกลุ่มโปรแกรมเมอร์ไทย ลองแกะ for ดู

ตอน i=9 ไล่ ascii ผิดครับ ภาพนี้แก้ไข
ตอน i=9 ไล่ ascii ผิดครับ ภาพนี้แก้ไข

<introduction>
อ่านโจทย์ที่น้อง Wongsakorn แชร์มาในกลุ่มสมาคมโปรแกรมเมอร์ไทย
บอกว่าเป็นแนวข้อสอบที่ ม. เห็นแล้วก็สนใจ สมาชิกเข้าไปเม้นท์เพียบ
https://www.facebook.com/groups/ThaiPGAssociateSociety/
มาโปรแแกรมเดียวแต่มี 12 คำถาม
เท่าที่ดูเป็นภาษา C ปรับเพิ่ม include แล้วเอาไปลองที่ jdoodle.com ได้
https://www.jdoodle.com/c-online-compiler
</introduction>

https://gist.github.com/thaiall/3f682a040fa1ebdd5d68dcbdede05750

<question>
คำถาม 12 ข้อมีดังนี้
1. loop for ทำงานกี่รอบ
2. ถ้า i=9 แล้วค่า t1 คืออะไร
3. ถ้า i=9 แล้วค่า s2[9] คืออะไร
4. ถ้า i=5 แล้วค่า t1 คืออะไร
5. ถ้า i=5 แล้วค่า t2 คืออะไร
6. ถ้า i=1 แล้วค่า t1 คืออะไร
7. ถ้า i=1 แล้วค่า t2 คืออะไร
8. ถ้า i=1 แล้วค่า s2[1] คืออะไร
9. ถ้าออก for แล้วค่า i คืออะไร
10. ถ้าออก for แล้วค่า sum คืออะไร
11. ถ้าออก for แล้วค่า s1[1] คืออะไร
12. ถ้าออก for แล้วค่า s2[7] คืออะไร
</question>

<process>
1. ดู code แล้วก็ต้องลองนำไป compile
เพราะถ้าตอบแล้วก็อยากพิสูจน์คำตอบ ว่าใช่หรือไม่
สุดท้ายแล้ว ผมก็ไม่ได้แก้ code ให้เฉลยตามโจทย์
เพราะดูผลจาก excel ก็น่าจะได้คำตอบครบแล้ว
แต่อาจนับผิดตำแหน่งใน Ascii table นั่นก็เป็น human error หละครับ

2. ลอง code ภาษา C
ที่ https://www.jdoodle.com/c-online-compiler

3. source code ไม่ได้มีเฉพาะ while, for และ variable
แต่มี function เข้ามาเกี่ยวข้อง ตัวแปรแบบ Array of character
และการตรวจสอบค่าก็เกี่ยวกับ Ascii table ชัดเจน
https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

4. ค่าของ Array of character และ strlen
ทดสอบ code กันก่อน ไปดู code จริง

#include <stdio.h>
 #include <string.h>
 void main() {
 char var1[] ="abcdef"; // strlen คืนค่า 6
 char var2[5] = "abc"; // size of the array is determined at compile-time
 char var3[5] = {'a', 'b', 'c', '\0'};
 char var4[3] = "abc";
 printf("%zu\n %zu\n",strlen(var1),strlen(var2)); //6 3
 printf("%zu\n %zu\n",strlen(var3),strlen(var4)); //3 3
 printf("%zu\n %s\n %c\n %c\n",strlen(var3),var4,var4[0],var4[2]); //3 abc a c
 // http://www.cplusplus.com/reference/cstdio/printf/
 // var1 = "abc"; can not do this for array of character in c language
 }

5. ฟังก์ชัน strcmp กับ strcat กับ strcpy
ทดสอบ code กันก่อน ไปดู code จริง
https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm

void main() {
 #include <stdio.h>
 #include <string.h>
 void main() {
 char var1[] ="abcd";
 char var2[5] = "abc";
 char var3[5] = "ABC";
 char var4[2] = {'a','\0'};
 char var5[2] = {'0','\0'}; //
 if(strcmp(var1,var2)>0) printf("true"); else printf("false"); // true : [3] 100 > 0
 if(strcmp(var2,var3)>0) printf("true"); else printf("false"); // true : [0] 97 > 65
 if(strcmp(var3,var4)>0) printf("true"); else printf("false"); // false : [0] 65 > 97
 if(strcmp(var4,var5)>0) printf("true"); else printf("false"); // true : [0] 97 > 30
 if(strcmp(var5,var1)>0) printf("true"); else printf("false"); // false : [0] 30 > 97
 strcpy(var4,var2); // var4 replaced by var2
 if(strcmp(var2,var4)==0) printf("true"); else printf("false"); // true : [0] abc = abc
 printf("%s %s",var2,var4); //abc abc
 strcpy(var5,var1); // var5 replaced by var1
 printf("%s %s",var1,var5); //abcd abcd
 strcat(var3,var4); // var3 = var3(ABC) + var4(abc) = ABCabc
 printf("%s %s",var3,var4); //ABCabc abc
 }

6. โปรแกรมนี้ใช้ mod ด้วย
ทดสอบ code กันก่อน ไปดู code จริง

char var1[] ="abcd";
printf("%i",var1[0] % 2); // 1
printf("%i",var1[1] % 2); // 0
printf("%i",var1[2] % 2); // 1

ในโจทย์ต้อง mod y คือตัวที่ 25 ในภาษาอังกฤษ น่าจะ mod 2 แล้วได้ 1 นะ

7. มีคำถามเรื่อง i ที่ออกจาก for แล้ว
ภาษา c จะคำนวนค่า i แล้วเปรียบเทียบ
ดังนั้นค่า i จะเป็นค่าที่อยู่นอกเงื่อนไขของ for

int i;
for(i=5;i>0;i=i-2) {}
printf("%i",i); // -1

8.มีคำถามหนึ่งที่เค้าไม่ได้ถาม แต่ผมสงสัย
คือ char ที่ไม่มีค่า หาก -1 จะได้เท่าใด คำตอบ คือ -1 เหมือนเดิม
เพราะค่าที่จองไว้ default เป็น 0 หมด
แต่ถ้าพิมพ์ค่าที่เกินจากที่จอง โปรแกรมไม่ error แต่เอาที่ไหนมาก็ไม่รู้
เช่น v[20] ออกมาเป็น 55 นั่นหละครับ

char v[10] = "abcde";
v[9] = v[9] - 1;
printf("%i %i %i %i %i",v[1],v[5],v[6],v[9],v[20]); // 98 0 0 -1 55

9. ถ้าเข้าใจฟังก์ชันทั้ง 4 แล้วก็เหลือแต่วน loop
ปกติก็จะทำเป็นตารางแบบ excel มี header แยก column ตามตัวแปร หรือตามชอบ
row ก็เป็นค่าของ i เท่าที่ดู code ก็ไม่เปลี่ยนค่า i กระทันหัน วนจนจบเลย
จากนี้ผมจะไปเปิด excel ช่วยล่ะครับ

10. สรุปว่าคำตอบทั้งหมด ผมไม่ได้ตอบนะ
แต่ดูจาก excel ที่ได้จากการไล่ค่าใน loop
ซึ่งเก็บเรื่องนี้ไว้ไปเล่าต่อ หากมีโอกาสน่ะครับ
เพราะผมเล่า for ซ้อน for กับ mod แค่นั้นก็เหนื่อยล่ะ
</process>

ภาพนี้ไล่ลำดับ i=9 ผิด ทำภาพมาใหม่อยู่ด้านบน
ภาพนี้ไล่ลำดับ i=9 ผิด ทำภาพมาใหม่อยู่ด้านบน

การแสดงชื่อภาพยนตร์ และ Rating ของแต่ละเรื่อง จากฐานข้อมูลของ IMDB.COM

eight and a half
eight and a half

สคลิ๊ปอ่านข้อมูลจาก ratings.list แบบ plain text
ที่เผยแพร่โดย imdb.com
มาแสดงผลในเว็บเพจแบบตาราง แบ่งหน้าละ 50 รายการ
และมีลิงค์ค้น title ในฐานข้อมูล imdb.com ผ่านชื่อเรื่อง
โดยปรับภาษาให้แสดงตัวอักษรชื่อเรื่อง
ผ่าน html ที่ใช้รหัส ord() เพื่อแสดงอักษรพิเศษ
เช่นเรื่อง 8½ (1963) ในรายการที่ 230

BD = 189 = ฝ = one by two

notepad++ is free editor for programmer
notepad++ is free editor for programmer

https://gist.github.com/thaiall/5f424d021c203b828710bdeaadee3c03

การสั่งแสดงตัวอักษร ก ใน CP874 บน Webpage

มีโอกาสนั่งคุยกับนักศึกษา
เรื่องตัวเลข ฐานสิบ ฐานสิบหก และตาราง ASCII
พบตาราง Character Set ของคนไทย คือ Windows-874 หรือ TIS-620
หากจะแสดงเว็บเพจภาษาไทย
มักใช้ <meta http-equiv=”content-type” content=”text/html;charset=windows-874″ />
หรือ <meta charset=”tis-620″ />
แล้วสั่งแสดงตัวอักษร ก ด้วย &#3585; หรือพิมพ์ตรง ๆ ก็ได้
หากใช้ตัวเลข ก็แสดงว่า 3585 คือ ก
ซึ่งเป็นเลขสำหรับตัวอักษรภาษาไทยตัวแรก ในระบบ Unicode
แล้วพบว่าไม่สามารถแสดงด้วย &#161; หรือ &#xA1;
เพราะ Browser ไม่ได้รองรับ
อักษรพิเศษอื่น ๆ ที่ชวนมอง และมี Entity Name

อาทิ
&amp; = Ampersand
# = Number sign
# = Hashtag sign
# = Sharp sign

 

โฮมเพจที่น่าสนใจ
http://www.w3schools.com/charsets/ref_utf_symbols.asp
http://www.rakjung.com/facebook-no163.html
http://www.thailibrary.in.th/2014/02/13/char-set/
https://en.wikipedia.org/wiki/Code_page