- บั๊กที่ทำให้พิมพ์ได้เฉพาะตัวพิมพ์ใหญ่ภาษาโปแลนด์ Ś ไม่ได้ในตัวแก้ไขเว็บของ Medium เกิดจากการซ้อนทับกันของธรรมเนียมการพิมพ์ สภาพแวดล้อมการนำเข้า PC นิสัยการใช้คีย์ลัดบันทึก และวิธีที่ Windows จัดการ Right Alt
- ภาษาโปแลนด์ใช้ตัวอักษรละตินพร้อมเพิ่ม อักษรมีเครื่องหมายกำกับเสียง 9 ตัว และในสภาพแวดล้อม PC ยุคแรก ๆ ได้ใช้ชุดผสม Alt+ตัวอักษรละติน แทนคีย์บอร์ดเฉพาะทาง จน “programmer’s layout” กลายเป็นมาตรฐานโดยพฤตินัย
- Windows แมป Right Alt ภายในให้ทำงานคล้าย Ctrl+Alt ทำให้ Right Alt+S ที่ใช้พิมพ์ Ś ดูจากมุมมองของระบบเหมือน Ctrl+Alt+S
- Medium ดักจับ Ctrl+S แล้วเรียก
preventDefault() เพื่อกันไม่ให้เบราว์เซอร์เปิดหน้าต่างบันทึก แต่ไม่ได้ตรวจว่ามี Alt อยู่ด้วยหรือไม่ จึงไปบล็อก การป้อนอักขระนั้นเอง
- การแก้ไขคือเพิ่ม
!e.altKey เข้าไปในเงื่อนไขบล็อก Ctrl+S ซึ่งเป็นการเปลี่ยนแปลงเล็กน้อยที่แสดงให้เห็นว่าธรรมเนียมการคอมพิวต์ที่ยึดอักษรอังกฤษ 26 ตัวเป็นศูนย์กลาง อาจสร้างข้อยกเว้นและแรงเสียดทานให้ผู้ใช้ภาษาอื่นได้
Ś ที่หายไปใน Medium
- ผู้ใช้รายหนึ่งรายงานว่าเมื่อเริ่มเขียนข้อความภาษาโปแลนด์ใน Medium ตัวอักษรอื่นพิมพ์ได้หมด แต่พิมพ์ Ś ไม่ได้เพียงตัวเดียว
- Medium ไม่ได้ปฏิบัติต่อภาษาใดเป็นพิเศษ และในบรรดาอักษร 32 ตัวของภาษาโปแลนด์ เหตุใดจึงมีปัญหากับตัวนี้เพียงตัวเดียว จึงดูแปลกในตอนแรก
- สาเหตุไม่ใช่ข้อบกพร่องของฟังก์ชันเดี่ยว ๆ แต่เป็นผลจาก วิธีป้อนข้อมูลและวิธีจัดการของระบบปฏิบัติการ ที่ซ้อนทับกันมาตลอดหลายทศวรรษ
ภาษาโปแลนด์และอักษรเพิ่มเติม
- ภาษาโปแลนด์เป็นภาษาสลาวิกที่มีผู้ใช้มากเป็นอันดับรองจากภาษารัสเซีย และมากกว่ายูเครน
- ต่างจากภาษารัสเซียและยูเครน ภาษาโปแลนด์ใช้ตัวอักษรอังกฤษ/ละตินเป็นฐาน แล้วเพิ่มตัวอักษรบางตัวเข้าไป
- เดิมทีคำภาษาโปแลนด์ไม่มี Q, V, X แต่ยังคงเก็บไว้เพื่อใช้กับภาษาละตินและคำยืม
- แทนที่จะเป็นเช่นนั้น จึงมีการใช้งาน อักษรมีเครื่องหมายกำกับเสียง 9 ตัว ที่อิงจากตัวอักษรละติน
- เครื่องพิมพ์ดีดช่วงต้นศตวรรษที่ 20 ต้องรองรับอักษรเพิ่มเติมเหล่านี้ บางตัวจึงมีปุ่มเฉพาะ แต่ที่เหลือต้องใช้ร่วมกับปุ่มตัวเลข
- ตัวพิมพ์ใหญ่อาจถูก “จำลอง” โดยพิมพ์ตัวอักษรละตินก่อน แล้วกด backspace กลับมาใส่เครื่องหมายกำกับเสียงทับ
- เพื่อเพิ่มพื้นที่สำหรับตัวอักษรเหล่านี้ เครื่องหมายวรรคตอนอย่างเซมิโคลอนและวงเล็บบางส่วนก็ต้องถูกสละไป
สภาพแวดล้อม PC ในโปแลนด์ยุคคอมมิวนิสต์และ programmer’s layout
- สภาพแวดล้อมคอมพิวเตอร์ส่วนบุคคลยุคแรกของโปแลนด์ในทศวรรษ 1980 เผชิญข้อจำกัดทั้ง รายได้ที่ใช้จ่ายได้ไม่มาก และการห้ามนำเข้าคอมพิวเตอร์ตะวันตกเชิงพาณิชย์
- คอมพิวเตอร์ที่เข้ามาจากตะวันตกมักมาพร้อมคู่มือเดิม ซอฟต์แวร์ที่ยังไม่แปล และคีย์บอร์ดแบบอเมริกันตามต้นฉบับ
- ประเทศอย่างฝรั่งเศสและเยอรมนีได้รับคีย์บอร์ดปรับแต่งตามเลย์เอาต์เครื่องพิมพ์ดีด แต่โปแลนด์ต้องหาวิธีพิมพ์อักษรเพิ่มเติม 9 ตัวบนคีย์บอร์ดแบบอเมริกัน
- เนื่องจาก Ctrl ถูกใช้เป็นคีย์ลัดอย่างแพร่หลายอยู่แล้ว ขณะที่ Alt ถูกใช้น้อยกว่า การใช้ ชุดผสม Alt จึงกลายเป็นมาตรฐานโดยพฤตินัย
- อักษรมีเครื่องหมายกำกับเสียง 8 ตัวถูกจับคู่กับตัวอักษรละตินที่สอดคล้องกัน
- อีก 1 ตัวที่เหลือถูกกำหนดไว้กับปุ่มที่อยู่ใกล้เคียง
- เลย์เอาต์เดิมถูกเรียกว่า “typist’s layout” ส่วนวิธีใหม่นี้เรียกว่า “programmer’s layout”
- อาจเป็นเพราะผู้ใช้ PC ยุคแรกส่วนใหญ่เป็นโปรแกรมเมอร์
- หรืออาจเป็นเพราะมันคงเครื่องหมายวรรคตอนที่ใช้บ่อยในการเขียนโปรแกรมไว้ตามเดิม
- programmer’s layout ใช้งาน ไม่ค่อยเหมาะตามหลักสรีรศาสตร์ เพราะต้องใช้ Alt ซ้ายเพียงปุ่มเดียวกดร่วมกับปุ่มใกล้ ๆ ด้วยมือข้างเดียว แต่ก็ฝังรากได้เพราะเข้าใจง่ายโดยไม่ต้องดัดแปลงฮาร์ดแวร์หรือติดสติกเกอร์
- ต่อมาจะมี typist’s keyboard แบบเฉพาะทางออกมา แต่แทบไม่มีใครเปลี่ยนไปใช้ และมีแนวโน้มคล้ายกับกรณีที่ QWERTY ซึ่งไม่ได้ดีที่สุดก็ยังแพร่หลาย
นิสัย Ctrl+S กับการชนกันในเว็บเอดิเตอร์
- ก่อนที่การบันทึกอัตโนมัติจะแพร่หลาย นิสัยการกดบันทึกเอกสารด้วยตัวเองเป็นสิ่งสำคัญ
- งานบันทึกในช่วงทศวรรษ 1980–1990 ช้า ทำให้สื่ออย่างดิสก์สึกหรอทีละน้อย และบางครั้งกิน CPU มากจนทำอย่างอื่นได้ยาก
- ผู้ใช้จึงฝึกนิสัยกด Command+S หรือ Ctrl+S ทุกครั้งที่พักจากการเขียน
- บางคนกดทุกย่อหน้า
- บางคนกดทุกประโยค และต่อมาก็ทุกไม่กี่คำ
- ในเว็บเอดิเตอร์ นิสัยนี้นำไปสู่ปัญหาที่เบราว์เซอร์เปิดหน้าต่างบันทึก HTML ของหน้าเว็บปัจจุบันขึ้นมา
- Medium เองก็เคยป้องกันสิ่งนี้ด้วยการตรวจจับ Ctrl+S หรือ Command+S ในโค้ดของเอดิเตอร์ แล้วสั่งบันทึกพร้อมบล็อกพฤติกรรมปกติ
if ((e.metaKey || e.ctrlKey) && e.keyCode === goog.events.KeyCodes.S) {
this._editors.save()
e.preventDefault()
}
- โค้ดนี้จะสั่งบันทึกในเอดิเตอร์และกันหน้าต่างบันทึกของเบราว์เซอร์ หากมีการกด S พร้อม
metaKey บน Mac หรือ ctrlKey บน Windows/Linux
- ปัญหาคือในบางสภาพแวดล้อม การพิมพ์ Ś ภาษาโปแลนด์ไม่ได้ดูเหมือน Alt+S แบบธรรมดา
วิธีที่ Windows จัดการ Right Alt
- Windows 3.x และ Windows 95 เปิดให้เข้าถึงรายการเมนูและคอนโทรลในกล่องโต้ตอบได้อย่างรวดเร็วด้วย Alt+ตัวอักษรที่ขีดเส้นใต้
- ในโปแลนด์ Alt ถูกใช้สำหรับป้อนอักษรมีเครื่องหมายกำกับเสียงอยู่แล้ว จึงเกิดการชนกับคีย์ลัดของ Windows
- เมื่อคีย์บอร์ดพัฒนาขึ้น จึงมีปุ่ม Alt สำรองทางขวาของ spacebar ทำให้ใช้ Alt ซ้ายกับคีย์ลัดของ Windows และใช้ Alt ขวากับการพิมพ์ภาษาโปแลนด์ได้
- แต่เพราะฟังก์ชัน Right Alt ต้องใช้งานได้แม้บนคีย์บอร์ดรุ่นเก่าที่มี Alt แค่ปุ่มเดียว Microsoft จึงแมป Right Alt ภายใน Windows ให้เป็นชุดกดพร้อมกันแบบ Ctrl+Alt ซึ่งไม่ค่อยมีใครใช้
- การตัดสินใจนี้ทำให้ Right Alt+S ที่ใช้พิมพ์ Ś ภาษาโปแลนด์ ดูจากมุมมองของระบบเหมือน Ctrl+Alt+S
- โค้ดบล็อก Ctrl+S ของ Medium ไม่ได้ตรวจว่ามี Alt ถูกกดอยู่ด้วยหรือไม่ ผลลัพธ์คือมันไปสกัดการพิมพ์ Ś ราวกับเป็นการบล็อกคีย์ลัดบันทึก
การแก้ไข: ถ้ามี Alt ถูกกดอยู่ ก็อย่านับเป็น Ctrl+S
- เมื่อระบุสาเหตุได้แล้ว วิธีแก้ก็ง่าย
- แทนที่จะบล็อก Ctrl+S เสมอ ก็เปลี่ยนเงื่อนไขให้บล็อกเฉพาะกรณีที่กด Ctrl โดย ไม่มี Alt ถูกกดอยู่
if ((e.metaKey || (e.ctrlKey && !e.altKey)) && e.keyCode === goog.events.KeyCodes.S) {
this._editors.save()
e.preventDefault()
}
- หลังการเปลี่ยนแปลง การกด Right Alt+S จะไม่เข้าเงื่อนไขบล็อกการบันทึกแบบ Ctrl+S
- Medium แก้บั๊กนี้แล้ว และต่อมาก็มีการใส่คอมเมนต์จำนวนมากไว้กับเงื่อนไขนี้เพื่อให้คนอ่านเข้าใจได้
ปัญหาที่ใหญ่กว่าหลังเงื่อนไขเล็ก ๆ
- คอมมิวนิสต์ในโปแลนด์ล่มสลายในปี 1989 และปัจจุบันทั้งบุคคลและบริษัทสามารถนำเข้าคอมพิวเตอร์ได้อย่างถูกกฎหมาย
- ทุกวันนี้ Windows และ Mac ที่ซื้อในโปแลนด์รองรับภาษาโปแลนด์อย่างสมบูรณ์ และระบบปฏิบัติการก็ถูกแปลเป็นภาษาท้องถิ่นแล้ว
- ถึงกระนั้น ในการตั้งค่าระบบก็ยังคงมี programmer’s layout อยู่ และยังเป็นตัวเลือกที่ถูกใช้บ่อยกว่าระหว่างสองเลย์เอาต์
- บั๊กเล็ก ๆ นี้เชื่อมโยงกับความจริงที่ว่าธรรมเนียมการคอมพิวต์แบบอเมริกันพัฒนามาโดยมี ตัวอักษรอังกฤษ 26 ตัวที่ไม่มีเครื่องหมายกำกับเสียง เป็นศูนย์กลาง
- ภาษาโปแลนด์ต้องย้ายไปมาระหว่างเลย์เอาต์อนุพันธ์ของ QWERTY พร้อมการประนีประนอม และภาษาที่ใช้ระบบอักษรห่างจากภาษาอังกฤษมากกว่านั้น อาจอยู่ในเงื่อนไขที่เสียเปรียบยิ่งกว่า
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมมองว่าเพราะภาษาโปแลนด์ใช้อักษรละติน และแสดงเสียงเพิ่มเติมด้วยการดัดแปลงแบบสลาฟเล็ก ๆ เท่านั้น จึงทำให้โปแลนด์ปรับตัวให้เข้ากับแนวทาง มุ่งตะวันตก ได้ง่ายกว่ามาก
ชาวโปแลนด์โดยเฉลี่ยใกล้ชิดกับเพื่อนบ้านทางตะวันตกในเชิงวัฒนธรรมมากกว่าชาวยูเครนหรือชาวรัสเซียมาก และข้อยกเว้นอาจมีแค่อาหาร
น่าสงสัยว่าในอนาคตอันไกล ยูเครนจะเดินเส้นทางเดียวกันหรือไม่
นักวิชาการมองว่าในช่วงเวลาใกล้เคียงกัน ภาษาโปแลนด์เริ่มพัฒนาเป็นภาษาที่แยกต่างหาก และจนถึงศตวรรษที่ 13 ยังสามารถสื่อสารกับเพื่อนบ้านทางใต้ได้โดยไม่มีปัญหาใหญ่
ในศตวรรษที่ 15–16 ระบบอักขรวิธีของโปแลนด์เริ่มก่อตัวขึ้น และ Stanisław Zaborowski กับ Jan Kochanowski พยายามเสนออักษรใหม่เพื่อสะท้อนระบบเสียงของภาษาโปแลนด์ในยุคนั้นให้แม่นยำขึ้น แต่ตัวอักษรที่พวกเขาเสนอค่อนข้างยาว
ในยุคที่ถูกแบ่งแยกและยึดครอง มีการ ทำให้เป็นรัสเซีย อย่างรุนแรงเพื่อกำจัดภาษาและวัฒนธรรมโปแลนด์ รวมถึงความพยายามนำอักษรซีริลลิกมาใช้ แต่สุดท้ายก็ล้มเหลว และวรรณกรรมในยุคนั้นมีผลงานจำนวนมากที่ว่าด้วยความรักชาติและความรักต่อปิตุภูมิ
การปฏิรูปภาษาในปี 1936 ทำให้ภาษาเข้าใกล้รูปแบบที่เรารู้จักในปัจจุบัน และในยุคคอมมิวนิสต์ มีการนำสรรพนามบุรุษที่ 2 พหูพจน์มาใช้ในภาษาทางการ คล้ายกับ vykání ในภาษาเช็กและสโลวัก แต่ฟังไม่เป็นธรรมชาติและมีสีสันทางการเมืองแรง จึงอยู่ได้ไม่นาน
ภาษาโปแลนด์มีภาษาถิ่น แต่หลังสงครามโลกครั้งที่ 2 การอพยพย้ายถิ่นทำให้ความแตกต่างเลือนลง และ ภาษาโปแลนด์มาตรฐาน ก็ลงหลักปักฐานในช่วงนั้นเช่นกัน ปัจจุบันมีคำยืมจากภาษาอังกฤษมากขึ้น เช่น hater ที่ถูกทำให้กลมกลืนเป็น hejter
คำพูดนี้น่าจะทำให้ชาวโปแลนด์จำนวนมากโกรธทีเดียว
ปัญหาจริง ๆ คือเบราว์เซอร์ไม่เปิดเผย วิธีง่าย ๆ ในการตรวจสอบคีย์ลัดแบบผสม และนักพัฒนาก็ไม่สร้างเอง
ในหลายเว็บ คีย์ลัดที่ตั้งใจไว้จะทำงานไปด้วยแม้มีปุ่มเสริมอย่าง alt หรือ shift กดร่วมอยู่
โค้ดที่ยกมานี้ก็แค่แก้ปัญหาที่ใหญ่กว่าบน Windows เท่านั้น แต่ alt+cmd+s ก็ยังถูกบล็อกอยู่ดี
ควรมีข้อเสนอให้เบราว์เซอร์เปิดเผยพร็อพเพอร์ตีในอีเวนต์ keydown/up/press ที่มีรหัสคีย์ลัดแบบ "CTRL+S", "CTRL+ALT+S"
แบบนั้นนักพัฒนาจะใช้พร็อพเพอร์ตีนั้นในการแยกเงื่อนไขได้ แทนที่จะต้องตรวจสอบ key code กับปุ่มเสริมเอง
นักพัฒนาเว็บก็ควรสร้างพร็อพเพอร์ตีแบบนี้ในโค้ดของตัวเอง แล้วใช้เปรียบเทียบแทนการตรวจปุ่มเสริมเอง นอกจากจะป้องกันบั๊กแบบในต้นฉบับได้แล้ว ยังใช้ง่ายขึ้นมากด้วย
ลองจินตนาการดูว่าถ้านักพัฒนามีตัวเลือกให้เข้าไปแทรกแซงได้ง่ายขึ้นและมากขึ้น จะสร้างความเสียหายได้ขนาดไหน
ถ้าจำเป็นต้องดักคีย์ ก็มี API ระดับต่ำอยู่แล้ว ควรจบแค่นั้นดีกว่า
อีกด้านหนึ่ง HTML มี แอตทริบิวต์ accesskey สำหรับกำหนดคีย์ลัดอยู่แล้ว: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/...
Copilot 365 ตัวใหม่ก็เป็นแบบนี้เป๊ะ ทุกครั้งที่พยายามพิมพ์ "Ć" Copilot ก็โผล่ขึ้นมา จนต้องปิดแอปซ้ำ ๆ
หลังจากย้ายมาแล้วก็ไม่เคยหันหลังกลับเลย
เขียนจาก SteamOS
ขอบคุณ Microsoft ดีใจที่เห็นว่าการประกันคุณภาพทำงานได้ดีนะครับ
ข้อเท็จจริงที่น่าสนใจ: เมื่อใช้การทำให้เป็นรูปแบบปกติแบบ canonical decomposition ของ Unicode ตัวอักษรโปแลนด์ 8 จาก 9 ตัว (ż, ó, ć, ę, ś, ą, ź, ń) จะถูกแยกเป็นตัวอักษรพื้นฐาน + เครื่องหมายกำกับเสียงแบบ combining แต่ ł จะยังคงอยู่เหมือนเดิม
ดังนั้นด้วย tokenizer unicode61 remove_diacritics ของ sqlite จึงไม่สามารถทำให้ข้อความภาษาโปแลนด์เป็นรูปแบบปกติสำหรับการค้นหาแบบ full-text ได้
ไม่แน่ใจนัก แต่ remove_diacritics ของ sqlite น่าจะทำงานคล้ายวิธีที่ผมเคยทำเอง คือแปลงเป็น NCD แล้วลบอักขระ combining ออกจากสตริง
คาดว่ากรณีพิเศษอื่น ๆ ที่ไม่ถูกแยก เช่น ħ หรือ ø ก็น่าจะทำงานคล้ายกัน
Lviv = 2.5 ล้าน
Vinnytsia = 1.5 ล้าน
Ivano-Frankivsk = 1.3 ล้าน
Khmelnytskyi = 1.2 ล้าน
Rivne = 1.1 ล้าน
Ternopil = 1 ล้าน
Volyn = 1 ล้าน
Chernivtsi = 8 แสน
Zakarpattia = 8 แสน (ไม่นับกลุ่มชาติพันธุ์ฮังการี)
แบบนี้ก็เท่ากับมี ชาวยูเครนตะวันตก 11.2 ล้านคน ที่ใช้ภาษายูเครนอย่างท่วมท้น และต่อให้ไม่นับภูมิภาคอื่นทั้งหมดเลย ก็ยังมากกว่าจำนวนผู้พูดภาษาเช็กอยู่ดี ยิ่งกว่านั้น ภูมิภาคอื่น ๆ ก็ไม่ได้เป็นเขตภาษารัสเซียล้วน ๆ และตอนนี้ยิ่งไม่ใช่เข้าไปใหญ่
น่าเสียดายที่ไม่ได้เป็นแค่ Medium เท่านั้น แอป Windows หลายตัวก็เป็นเหมือนกัน ตัวอย่างเช่นใน Active Presenter แค่พิมพ์ตัวอักษรหนึ่งตัว น่าจะเป็น Ó การบันทึกหน้าจอก็จะหยุด ทำให้หลายครั้งไม่สามารถบันทึกฉากที่พิมพ์เป็นภาษาโปแลนด์ได้
แอปอื่น ๆ ก็ดูเหมือนจะทำคล้ายกัน คือกำหนดชุดปุ่ม Alt + Ctrl + ตัวอักษรเป็นทางลัด แล้วไปเขียนทับไดรเวอร์เลย์เอาต์คีย์บอร์ดไม่ทางใดก็ทางหนึ่ง
นี่ปี 2026 แล้ว แต่จู่ ๆ Edge บน Mac ก็พิมพ์ตัวพิมพ์ใหญ่ Ś ไม่ได้ รู้สึกเหมือนย้อนกลับไปอดีตราว 25 ปีก่อน
nvidia overlay มีทางลัด Alt+Z ซึ่งทำงานทั้งกับ Alt ซ้ายและ Alt ขวา ทำให้ผู้ใช้ภาษาโปแลนด์พิมพ์ “ż” ไม่ได้ เว้นแต่จะเปิด overlay หรือไปกำหนดปุ่มใหม่ ค่อนข้างน่าหงุดหงิด
Nvidia ช่วยแก้ทีเถอะ
สรุปคือแบบนี้:
บน Windows เนื่องจากมีการใช้ชุดปุ่ม Alt อยู่แล้ว มันจึงกลายเป็น Alt ขวา+s และถึงแม้ Windows เองจะไม่ได้ใช้ Alt ขวา แต่แทนที่จะมีโค้ด Alt ขวาแยกต่างหาก Windows กลับเขียนปุ่มนั้นใหม่เป็นชุด ctrl+alt
ถ้าจะสรุป อย่างน้อยรายละเอียดที่สำคัญที่สุดก็ควรให้ถูก ผู้คนกดแค่ Alt แต่ Windows ไปเปลี่ยนเป็น “ตอนนี้กำลังกด ctrl+alt อยู่” ทำให้ alt+s ดูเหมือน ctrl+s และมี Alt แถมติดมาด้วย ซึ่งไม่มีใครตรวจสอบตอนดักจับอีเวนต์แล้วฆ่ามันทิ้ง