coreutils ที่ utf ทราบหรือไม่?


16

เมื่อฉันใช้cutวันนี้ฉันพบว่ามันไม่ได้ใช้อักขระ UTF-8 เป็นตัวละคร แต่เป็น 3 ตัวเพราะความยาว 3 ไบต์

เรื่องนี้ดูเหมือนจะเป็นจริงสำหรับเครื่องมือต่าง ๆ

มีรุ่นของcoreutilsUTF-8 ที่ทราบหรือไม่

localeผลลัพธ์ของฉัน:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

นี่คือเมื่อcutไม่ทำงาน

echo 哈哈 | cut -c 2-
��哈

ผลลัพธ์ที่ถูกต้องควรเป็น

หากcut -cทำงานกับอักขระหลายไบต์


คุณตั้งค่าไว้localeถูกต้องหรือไม่? การอ่านlocaleคำสั่ง (อาร์กิวเมนต์ w / o) คืออะไร
alex

ฉันได้อัปเดตด้วยสถานที่แล้ว
Chao Xu

ตกลงคุณสามารถเพิ่มตัวอย่างของcutบรรทัดคำสั่งของคุณได้หรือไม่
alex

สามารถยืนยันสิ่งนี้บน Ubuntu 10.04 ด้วยecho ßßßß | cut -c 2--> �ßßß( LANG=en_US.UTF-8)
maxschlepzig

สิ่งที่น่าเศร้าก็คือ 3 ปีต่อมาสิ่งนี้ยังคงเป็นจริงใน Ubuntu 13.10 ...
Dr. Mike

คำตอบ:


13

coreutils ของ GNU เข้าใจ UTF-8 โดยทั่วไป ตัวอย่างเช่นecho 哈哈 | wc -mผลลัพธ์ที่ถูกต้อง3ในโลแคล UTF-8 (โปรดทราบว่าตัวเลือกนั้น-mไม่ใช่-cสำหรับเหตุผลในอดีตหมายถึงไบต์)

cutนี่คือข้อผิดพลาดใน กำลังมองหาที่มาของcut ,cutตัวละครเป็นเพียงการไม่ได้ดำเนินการคือตัวเลือกที่จะถือว่าเป็นคำพ้องความหมายของ-c-b

วิธีแก้ปัญหาคือใช้ awk GNU awk copes กับ UTF-8 ได้ดี

awk '{print substr($0,2,length)}'

8
มันจะคุ้มค่าในการจัดทำรายงานข้อผิดพลาด (แม้ว่ามันจะกลายเป็นสิ่งที่ซ้ำกัน) เพื่อรบกวนผู้ดูแลคอร์ทูติลให้แก้ไขข้อผิดพลาดเช่นนี้แทนที่จะเพิ่มแฮ็กที่โง่และสาธารณูปโภคของเล่นที่ไม่มีใครต้องการ ...
R. GitHub STOP ช่วย ICE

3

ดูเหมือนว่าบั๊กในบิลด์ / เวอร์ชันของคุณ coreutilsคุณ ฉันสามารถทำซ้ำได้บน Ubuntu 10.10 ไม่ฝักใฝ่ฝ่ายใดเมียร์แคต แต่ไม่ใช่ใน Fedora 15

[patches @ holocene ~] $ cat / etc / fedora-release 
Fedora รีลีส 15 (Lovelock)
[patches @ holocene ~] $ rpm -q coreutils
coreutils-8.10-2.fc15.x86_64
[patches @ holocene ~] $ echo 哈哈 | ตัด -c 2-
哈
[patches @ holocene ~] $ sudo chroot / mnt / maverick
root @ holocene: / # grep DISTRIB_DESC / etc / lsb-release
DISTRIB_DESCRIPTION = "Ubuntu 10.10"
root @ holocene: / # dpkg-query -s coreutils | เวอร์ชัน grep
เวอร์ชั่น: 8.5-1ubuntu3
root @ holocene: / # echo 哈哈 | ตัด -c 2-
哈

หากคุณใช้งาน Ubuntu ด้วยคุณสามารถรายงานข้อบกพร่องไปยังตัวทำcoreutilsแพ็กเกจของUbuntu ได้โดยใช้คำสั่งต่อไปนี้:

apport-bug coreutils

อัปเดต: Gilles ชี้ให้เห็นในความคิดเห็นว่านี่เป็นข้อผิดพลาดในเวอร์ชั่นอัปสตรีมของcoreutilsFedora ที่ได้รับการแก้ไขแล้ว คุณสามารถหาแพทช์ของพวกเขาได้ที่นี่หากคุณต้องการที่จะลองแก้ไขด้วยตัวเองเพื่อให้มันทำงานได้


ฉันแค่ดูที่แหล่งและมันเป็นบั๊กต้นน้ำที่ Fedora เห็นได้ชัดว่าได้รับการแก้ไข แหล่งต้นน้ำก็ทำให้นามแฝงของ-c -b
Gilles 'หยุดชั่วร้าย'

@Gilles: น่าสนใจ ฉันเชื่อมโยงกับ patch ของ Fedora ในคำตอบของฉันในกรณีที่มีคนต้องการลองแก้ไขด้วยตนเอง
แพทช์

ลิงก์เสีย
corvus_192
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.