โซลูชันส่วนหัวเดียวที่เรียบง่ายเพื่อรองรับสตริง utf8 ใน C และ C++
ฟังก์ชั่นที่ได้รับจากส่วนหัว C string.h แต่มีคำนำหน้า utf8* แทนที่จะเป็นคำนำหน้า str*:
เอกสารฟังก์ชัน API
| สตริง.h | utf8.h | สมบูรณ์ | C++14 contexpr |
|---|---|---|---|
| ยืดเยื้อ | utf8cat | ||
| สเตรชอาร์ | utf8chr | ||
| strcmp | utf8cmp | ||
| strcoll | utf8coll | ||
| เข้มงวด | utf8cpy | ||
| strcspn | utf8cspn | ||
| strdup | utf8dup | ||
| ทอดกรอบ | utf8fry | ||
| สเตรน | utf8len | ||
| สเตรนเลน | utf8nlen | ||
| สเตรนแคท | utf8ncat | ||
| strncmp | utf8ncmp | ||
| เข้มงวด | utf8ncpy.utf8ncpy | ||
| strndup | utf8ndup | ||
| strpbrk | utf8pbrk | ||
| strrchr | utf8rchr | ||
| strsep | utf8 ก.ย | ||
| strspn | utf8spn | ||
| strstr | utf8str | ||
| สต็อค | utf8tok | ||
| strxfrm | utf8xfrm.utf8xfrm |
ฟังก์ชั่นที่ได้รับจากสตริงส่วนหัว C แต่ใช้คำนำหน้า utf8* แทนคำนำหน้า str*:
| สตริง.h | utf8.h | สมบูรณ์ | C++14 contexpr |
|---|---|---|---|
| strcasecmp | utf8casecmp.php | ||
| strncasecmp | utf8ncasecmp | ||
| strcasestr | utf8casestr |
ฟังก์ชั่นที่มีให้ซึ่งเป็นเอกลักษณ์ของ utf8.h:
| utf8.h | สมบูรณ์ | C++14 contexpr |
|---|---|---|
| utf8codepoint | ||
| utf8rcodepoint | ||
| utf8size | ||
| utf8size_lazy | ||
| utf8nsize_lazy | ||
| utf8valid | ||
| utf8nvalid | ||
| utf8makevalid | ||
| utf8codepointsize.php | ||
| utf8catcodepoint | ||
| utf8isupper.php? | ||
| utf8islower | ||
| utf8lwr | ||
| utf8upr | ||
| utf8lwrcodepoint.php | ||
| utf8uprcodepoint |
เพียง #include "utf8.h" ในโค้ดของคุณ!
แพลตฟอร์มที่รองรับในปัจจุบัน ได้แก่ Linux, macOS และ Windows
คอมไพเลอร์ที่รองรับในปัจจุบัน ได้แก่ gcc, clang, cl.exe ของ MSVC และ clang-cl.exe
utf8.h API ตรงกับ string.h API มากที่สุดเท่าที่จะเป็นไปได้โดยการออกแบบ มีความแตกต่างที่สำคัญบางประการ
utf8.h ใช้ char8_t* ใน C++ 20 แทน char*
ทุกที่ในเอกสาร string.h หรือ strings.h ที่อ้างถึง 'ไบต์' ฉันได้เปลี่ยนจุดนั้นเป็นจุดรหัส utf8 ตัวอย่างเช่น utf8len จะส่งคืนจำนวนจุดรหัส utf8 ในสตริง utf8 ซึ่งไม่จำเป็นต้องเท่ากับจำนวนไบต์
int utf8casecmp ( const void * src1 , const void * src2 ); ส่งคืนค่าน้อยกว่า 0, 0 มากกว่า 0 ถ้า src1 < src2 , src1 == src2 , src1 > src2 ตามลำดับ ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
void * utf8cat ( void * dst , const void * src ); ผนวกสตริง utf8 src เข้ากับสตริง utf8 dst
void * utf8chr ( const void * src , utf8_int32_t chr ); ค้นหาคู่แรกของ utf8 codepoint chr ในสตริง utf8 src
int utf8cmp ( const void * src1 , const void * src2 ); ส่งกลับน้อยกว่า 0, 0 มากกว่า 0 ถ้า src1 < src2 ,
src1 == src2 , src1 > src2 ตามลำดับ
void * utf8cpy ( void * dst , const void * src ); คัดลอกสตริง utf8 src ไปยังหน่วยความจำที่จัดสรรใน dst
size_t utf8cspn ( const void * src , const void * reject ); จำนวนจุดรหัส utf8 ในสตริง utf8 src ที่ประกอบด้วยทั้งหมด
ของจุดรหัส utf8 ที่ไม่ได้มาจากสตริง utf8 reject
void * utf8dup ( const void * src ); ทำซ้ำสตริง utf8 src โดยรับขนาดของมัน โดย malloc ใช้บัฟเฟอร์ใหม่
คัดลอกข้อมูลแล้วส่งคืน หรือ 0 ถ้า malloc ล้มเหลว
size_t utf8len ( const void * str ); จำนวนจุดรหัส utf8 ในสตริง utf8 str
ไม่รวม ไบต์ที่สิ้นสุดด้วยค่า null
size_t utf8nlen ( const void * str , size_t n ); คล้ายกับ utf8len ยกเว้นว่าจะดู src มากที่สุดเพียง n ไบต์เท่านั้น
int utf8ncasecmp ( const void * src1 , const void * src2 , size_t n ); ส่งคืนค่าน้อยกว่า 0, 0 มากกว่า 0 ถ้า src1 < src2 , src1 == src2 ,
src1 > src2 ตามลำดับ ไม่คำนึงถึงขนาดตัวพิมพ์ การตรวจสอบอย่างมากที่สุด n
ไบต์ของแต่ละสตริง utf8
void * utf8ncat ( void * dst , const void * src , size_t n ); ต่อท้ายสตริง utf8 src เข้ากับสตริง utf8 dst
เขียนได้สูงสุด n+1 ไบต์ สามารถสร้าง utf8 ที่ไม่ถูกต้องได้
สตริงถ้า n ตกอยู่กึ่งกลางผ่านจุดโค้ด utf8
int utf8ncmp ( const void * src1 , const void * src2 , size_t n ); ส่งกลับน้อยกว่า 0, 0 มากกว่า 0 ถ้า src1 < src2 ,
src1 == src2 , src1 > src2 ตามลำดับ การตรวจสอบอย่างมากที่สุด n
ไบต์ของแต่ละสตริง utf8
void * utf8ncpy ( void * dst , const void * src , size_t n ); คัดลอกสตริง utf8 src ไปยังหน่วยความจำที่จัดสรรใน dst
คัดลอกได้สูงสุด n ไบต์ หาก n ตกไปบางส่วนผ่านจุดรหัส utf8 หรือหาก dst ไม่มีที่ว่างเพียงพอสำหรับจุดสิ้นสุดที่เป็นโมฆะ สตริงสุดท้ายจะถูกตัดให้สั้นเพื่อรักษาความถูกต้องของ utf8
void * utf8pbrk ( const void * str , const void * accept ); ค้นหาตำแหน่งที่เกิดขึ้นครั้งแรกในสตริง utf8 str ของไบต์ใดๆ ใน
สตริง utf8 accept หรือ 0 หากไม่พบรายการที่ตรงกัน
void * utf8rchr ( const void * src , utf8_int32_t chr ); ค้นหาการจับคู่ครั้งสุดท้ายของ utf8 codepoint chr ในสตริง utf8 src
size_t utf8size ( const void * str ); จำนวนไบต์ในสตริง utf8 str
รวมถึงไบต์ที่สิ้นสุดด้วยค่า null
size_t utf8size_lazy ( const void * str ); คล้ายกับ utf8size ยกเว้นว่า ไม่รวม ไบต์ที่สิ้นสุดด้วยค่า null
size_t utf8nsize_lazy ( const void * str , size_t n ); คล้ายกับ utf8size ยกเว้นว่าจะค้นหา src สูงสุด n ไบต์เท่านั้น และ ไม่รวม ไบต์ที่สิ้นสุดด้วยค่า null
size_t utf8spn ( const void * src , const void * accept ); จำนวนจุดรหัส utf8 ในสตริง utf8 src ที่ประกอบด้วยทั้งหมด
ของจุดรหัส utf8 จากสตริง utf8 accept
void * utf8str ( const void * haystack , const void * needle ); ตำแหน่งของ needle สตริง utf8 ใน haystack สตริง utf8
void * utf8casestr ( const void * haystack , const void * needle ); ตำแหน่งของ needle สตริง utf8 ใน haystack สตริง utf8 ไม่คำนึงถึงขนาดตัวพิมพ์
void * utf8valid ( const void * str );ส่งคืนค่า 0 เมื่อสำเร็จ หรือตำแหน่งของจุดรหัส utf8 ที่ไม่ถูกต้องเมื่อล้มเหลว
void * utf8nvalid ( const void * str , size_t n ); คล้ายกับ utf8valid ยกเว้นว่าจะดู src มากที่สุดเพียง n ไบต์เท่านั้น
int utf8makevalid ( void * str , utf8_int32_t replacement ); กลับ 0 เมื่อสำเร็จ ทำให้ str ถูกต้องโดยการแทนที่ลำดับที่ไม่ถูกต้องด้วยโค้ดพอยต์ replacement ขนาด 1 ไบต์
void * utf8codepoint ( const void * str , utf8_int32_t * out_codepoint ); ตั้งค่า out_codepoint เป็นจุดรหัส utf8 ปัจจุบันใน str และส่งคืนที่อยู่ของจุดรหัส utf8 ถัดไปหลังจากที่อยู่ปัจจุบันใน str
void * utf8rcodepoint ( const void * str , utf8_int32_t * out_codepoint ); ตั้งค่า out_codepoint เป็นจุดรหัส utf8 ปัจจุบันใน str และส่งคืนที่อยู่ของจุดรหัส utf8 ก่อนหน้าที่อยู่ก่อนหน้าจุดปัจจุบันใน str
size_t utf8codepointsize ( utf8_int32_t chr );ส่งกลับขนาดของจุดรหัสที่กำหนดในหน่วยไบต์
void * utf8catcodepoint ( void * utf8_restrict str , utf8_int32_t chr , size_t n );เขียนจุดรหัสลงในสตริงที่กำหนด และส่งกลับที่อยู่ไปยังตำแหน่งถัดไปหลังจากจุดรหัสที่เขียน ส่งผ่านจำนวนไบต์ที่เหลืออยู่ในบัฟเฟอร์ไปยัง n หากมีเนื้อที่ไม่เพียงพอสำหรับจุดโค้ด ฟังก์ชันนี้จะส่งคืนค่าว่าง
int utf8islower ( utf8_int32_t chr );ส่งคืน 1 ถ้าอักขระที่กำหนดเป็นตัวพิมพ์เล็ก หรือ 0 หากไม่ใช่
int utf8isupper ( utf8_int32_t chr );ส่งคืน 1 หากอักขระที่กำหนดเป็นตัวพิมพ์ใหญ่ หรือ 0 หากไม่ใช่
void utf8lwr ( void * utf8_restrict str );แปลงสตริงที่กำหนดให้เป็นจุดรหัสตัวพิมพ์เล็กทั้งหมด
void utf8upr ( void * utf8_restrict str );แปลงสตริงที่กำหนดเป็นจุดรหัสตัวพิมพ์ใหญ่ทั้งหมด
utf8_int32_t utf8lwrcodepoint ( utf8_int32_t cp );สร้าง codepoint ตัวพิมพ์เล็กหากเป็นไปได้
utf8_int32_t utf8uprcodepoint ( utf8_int32_t cp );สร้าง codepoint ตัวพิมพ์ใหญ่หากเป็นไปได้
ฟังก์ชันต่างๆ ที่มีให้จะทำการเปรียบเทียบโดยไม่คำนึงถึงขนาดตัวพิมพ์ หรือแปลงสตริง utf8 จากกรณีหนึ่งไปอีกกรณีหนึ่ง เมื่อพิจารณาถึงความกว้างใหญ่ของยูนิโค้ด และผู้เขียนขาดความเข้าใจนอกเหนือจากจุดรหัสภาษาละตินว่าตัวพิมพ์ใหญ่และเล็กมีความหมายอะไรไหม หมวดหมู่ต่อไปนี้เป็นเพียงหมวดหมู่เดียวที่จะถูกตรวจสอบในโค้ดที่ไม่คำนึงถึงขนาดตัวพิมพ์:
นี่เป็นซอฟต์แวร์ฟรีและไม่มีภาระผูกพันที่เผยแพร่สู่สาธารณสมบัติ
ทุกคนมีอิสระในการคัดลอก แก้ไข เผยแพร่ ใช้ คอมไพล์ ขาย หรือแจกจ่ายซอฟต์แวร์นี้ ไม่ว่าจะในรูปแบบซอร์สโค้ดหรือในรูปแบบไบนารีที่คอมไพล์ เพื่อวัตถุประสงค์ใดๆ ก็ตามในเชิงพาณิชย์หรือไม่ใช่เชิงพาณิชย์ และไม่ว่าด้วยวิธีใดก็ตาม
ในเขตอำนาจศาลที่ยอมรับกฎหมายลิขสิทธิ์ ผู้เขียนหรือผู้เขียนซอฟต์แวร์นี้อุทิศผลประโยชน์ด้านลิขสิทธิ์ใดๆ และทั้งหมดในซอฟต์แวร์ให้เป็นสาธารณสมบัติ เราอุทิศตนเพื่อประโยชน์ของส่วนรวมและเพื่อความเสียหายต่อทายาทและผู้สืบทอดของเรา เราตั้งใจว่าการอุทิศตนนี้จะเป็นการกระทำที่เปิดเผยเป็นการละทิ้งสิทธิ์ในซอฟต์แวร์นี้ทั้งในปัจจุบันและอนาคตภายใต้กฎหมายลิขสิทธิ์ตลอดไป
ซอฟต์แวร์นี้มีให้ "ตามที่เป็น" โดยไม่มีการรับประกันใดๆ ทั้งโดยชัดแจ้งหรือโดยนัย ซึ่งรวมถึงแต่ไม่จำกัดเพียงการรับประกันความสามารถในการค้าขาย ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ และการไม่ละเมิด ไม่ว่าในกรณีใดผู้เขียนจะต้องรับผิดต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าในการกระทำของสัญญาการละเมิดหรืออย่างอื่นที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือข้อตกลงอื่น ๆ ในซอฟต์แวร์
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ http://unlicense.org/