นับจำนวนไบต์ของโปรแกรม


21

หมายเหตุ 2: ฉันยอมรับ@DigitalTraumaคำตอบแบบยาว 6 ไบต์ หากใครสามารถเอาชนะได้ฉันจะเปลี่ยนคำตอบที่ยอมรับได้ ขอบคุณสำหรับการเล่น!

หมายเหตุ: ฉันจะยอมรับคำตอบเวลา 18.00 น. MST ในวันที่ 10/14/15 ขอบคุณทุกคนที่เข้าร่วม!

ฉันประหลาดใจมากที่สิ่งนี้ยังไม่ได้ถูกถาม (หรือฉันค้นหาไม่หนักพอ) ไม่ว่าจะด้วยวิธีใดความท้าทายนี้ง่ายมาก:

อินพุต:โปรแกรมในรูปแบบของสตริง นอกจากนี้อินพุตอาจมีหรือไม่มี:

  • ช่องว่างนำหน้าและต่อท้าย
  • ขึ้นบรรทัดใหม่
  • อักขระที่ไม่ใช่ ASCII

เอาท์พุท:สองจำนวนเต็มหนึ่งแทนจำนวนอักขระ UTF-8และหนึ่งแทนนับไบต์คุณอาจเลือกลำดับ ขึ้นบรรทัดใหม่ที่ได้รับอนุญาต เอาต์พุตสามารถไปที่ STDOUT หรือส่งคืนจากฟังก์ชัน IT สามารถอยู่ในรูปแบบใดก็ได้ตราบใดที่ตัวเลขสองตัวนั้นแตกต่างจากกัน (2327 ไม่ใช่เอาต์พุตที่ถูกต้อง)

หมายเหตุ:

ตัวอย่าง I / O: (เอาต์พุตทั้งหมดอยู่ในรูปแบบ{characters} {bytes})

การป้อนข้อมูล: void p(int n){System.out.print(n+5);}

เอาท์พุท: 37 37

การป้อนข้อมูล: (~R∊R∘.×R)/R←1↓ιR

เอาท์พุท: 17 27

การป้อนข้อมูล:


friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print "iteration {iteration} is {name}".format(iteration=i, name=name)

เอาท์พุท: 156 156

นี่คือรหัสกอล์ฟ - รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

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

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=60733,OVERRIDE_USER=36670;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


เอาท์พุทจะต้องมีการแยกช่องว่าง?
Maltysen

ไม่สามารถอยู่ในรูปแบบใดก็ได้ตราบใดที่ตัวเลขสามารถแยกออกจากกัน (2327 ไม่ใช่เอาต์พุตที่ถูกต้อง)
GamrCorps

ไม่มีอักขระ UTF-8 บางตัวที่ขึ้นอยู่กับการตีความสามารถแบ่งออกเป็นอักขระอื่น ๆ สองตัวที่สร้างค่าไบต์เดียวกันได้หรือไม่ เราจะนับสิ่งเหล่านั้นได้อย่างไร
Patrick Roberts

สุจริตฉันไม่ทราบว่าคุณหมายถึงอะไร ดังนั้นให้นับตามที่คุณต้องการ
GamrCorps

@GamrCorps อักขระ UTF-8 ประกอบด้วยอักขระที่ไม่ใช่ ASCII ซึ่งโดยทั่วไปเป็นอักขระที่ไม่สามารถแทนด้วยหนึ่งไบต์ แต่ต้องแสดงด้วยสองหรือสี่ไบต์ ขึ้นอยู่กับวิธีที่ตัวละครอ่านโดยโปรแกรมมันขึ้นอยู่กับโปรแกรมที่จะเลือกวิธีการตีความกระแสของไบต์ ตัวอย่างเช่น UTF-8 ขนาด 2 ไบต์สามารถตีความได้ว่าเป็นอักขระ ASCII ตามลำดับ 2 ตัวอักขระแต่ละตัวจะถูกแทนด้วยสองไบต์ซึ่งประกอบขึ้นเป็นอักขระที่ตั้งใจไว้ แต่เดิม
Patrick Roberts

คำตอบ:


32

Shell + coreutils, 6

คำตอบนี้จะไม่ถูกต้องหากใช้การเข้ารหัสที่ไม่ใช่ UTF-8

wc -mc

ผลการทดสอบ:

$ printf '%s' "(~R∊R∘.×R)/R←1↓ιR" | ./count.sh 
     17      27
$ 

ในกรณีที่รูปแบบผลลัพธ์ถูกบังคับใช้อย่างเข้มงวด (เพียงหนึ่งช่องว่างที่แยกจำนวนเต็มสองจำนวน) จากนั้นเราสามารถทำสิ่งนี้:

Shell + coreutils, 12

echo`wc -mc`

ขอขอบคุณที่ @immibis echoสำหรับการแนะนำเพื่อลบพื้นที่หลัง ฉันใช้เวลาสักครู่กว่าจะเข้าใจว่า - เชลล์จะขยายสิ่งนี้ไปecho<tab>n<tab>mเป็นและแท็บโดยค่าเริ่มต้นอยู่ใน$IFSดังนั้นตัวคั่นโทเค็นที่ถูกต้องตามกฎหมายอย่างสมบูรณ์ในคำสั่งผลลัพธ์


13
เป็นเครื่องมือที่เหมาะสมสำหรับงานอย่างแน่นอน
Alex A.

1
คุณสามารถลบช่องว่างหลังจาก "echo" ได้หรือไม่
253751

@immibis ใช่ - ดี - ฉันไม่เห็นว่าวิธีการทำงานทันที
Digital Trauma

21

GolfScript, 14 12 ไบต์

.,p{64/2^},,

ลองมันออนไลน์บนเว็บ GolfScript

ความคิด

GolfScript ไม่มีเงื่อนงำว่า Unicode คืออะไร สตริงทั้งหมด (อินพุตเอาต์พุตภายใน) ประกอบด้วยไบต์ ในขณะที่อาจจะน่ารำคาญสวยมันเหมาะสำหรับความท้าทายนี้

UTF-8 เข้ารหัสอักขระ ASCII และไม่ใช่ ASCII แตกต่างกัน:

  • จุดรหัสทั้งหมดด้านล่าง 128 0xxxxxxxจะถูกเข้ารหัส

  • ทุกจุดรหัสอื่น ๆ 11xxxxxx 10xxxxxx ... 10xxxxxxจะถูกเข้ารหัสเป็น

ซึ่งหมายความว่าการเข้ารหัสของอักขระ Unicode แต่ละตัวมี0xxxxxxxไบต์เดียวหรือ11xxxxxxไบต์เดียว(และ 0 ถึง 5 10xxxxxxไบต์)

โดยการหารไบต์ทั้งหมดของการป้อนข้อมูลโดย64เราหัน0xxxxxxxเข้า0หรือ1 , 11xxxxxxเข้าไปใน3และ10xxxxxxออกเป็น2 สิ่งที่เหลือคือการนับไบต์ที่มีความฉลาดไม่ได้2

รหัส

                (implicit) Read all input and push it on the stack.
.               Push a copy of the input.
 ,              Compute its length (in bytes).
  p             Print the length.
   {     },     Filter; for each byte in the original input:
    64/           Divide the byte by 64.
       2^         XOR the quotient with 2.
                If the return is non-zero, keep the byte.
           ,    Count the kept bytes.
                (implicit) Print the integer on the stack.

9

Python 42 42ไบต์

lambda i:[len(i),len(i.encode('utf-8'))]

ขอบคุณ Alex A. สำหรับการปิดสองไบต์

ตรงไปตรงมาทำในสิ่งที่พูด ด้วยอาร์กิวเมนต์iให้พิมพ์ความยาวของiจากนั้นความยาวเป็นiUTF-8 '''หมายเหตุว่าเพื่อที่จะรับข้อมูลหลายอาร์กิวเมนต์ฟังก์ชั่นที่ควรจะล้อมรอบด้วยคำพูดที่สาม:

แก้ไข: มันไม่ทำงานสำหรับอินพุตหลายบรรทัดดังนั้นฉันจึงทำให้มันเป็นฟังก์ชั่นแทน

กรณีทดสอบบางอย่าง (คั่นด้วยบรรทัดว่างใหม่):

f("Hello, World!")
13 13

f('''
friends = ['john', 'pat', 'gary', 'michael']
for i, name in enumerate(friends):
    print "iteration {iteration} is {name}".format(iteration=i, name=name)
''')
156 156

f("(~R∊R∘.×R)/R←1↓ιR")
17 27

และที่นี่ตลอดเวลาที่ฉันใช้แค่เลน () เหมือนเครื่องดูด นี่เป็นสิ่งที่เหนือกว่าอย่างชัดเจน
สถานะ

3
lambda i:[len(i),len(i.encode('utf-8'))]เนื่องจากการส่งออกสามารถกลับมาจากฟังก์ชั่นที่คุณสามารถบันทึกไม่กี่ไบต์โดยการนี้
Alex A.

@AlexA เอาล่ะการเปลี่ยนแปลง ไม่เคยสัมผัสแลมบ์ดามาก่อน
The_Basset_Hound

1
แลมบ์ดาของคุณไม่ถูกต้องนัก หากคุณให้ความหมายก็จะเป็นแต่เนื่องจากคุณกำลังใช้ฟังก์ชั่นแลมบ์ดาที่ไม่ระบุชื่อมันก็ควรจะเป็นf=lambda i:[len(i),len(i.encode('utf-8'))] lambda i:[len(i),len(i.encode('utf-8'))]
Kade

1
คุณสามารถบันทึกไม่กี่ไบต์ที่มีแทนU8 utf-8
Mego

5

จูเลีย 24 ไบต์

s->(length(s),sizeof(s))

สิ่งนี้จะสร้างฟังก์ชั่นแลมบ์ดาที่ส่งกลับค่าจำนวนเต็ม lengthฟังก์ชั่นเมื่อเรียกสตริงกลับจำนวนของตัวละคร sizeofฟังก์ชันส่งกลับจำนวนไบต์ในการป้อนข้อมูล

ลองออนไลน์



3

Pyth - 12 9 ไบต์

จะพยายามทำให้สั้นลง

lQh/l.BQ8

Test Suite


สิ่งนี้ให้ไบต์มากเกินไปสำหรับการนับ UTF-8 ขณะนี้floor(… / 8) + 1เป็นที่ควรจะเป็นceil(… / 8)
PurkkaKoodari

.Bนี้ช่วยให้ฉันจับข้อผิดพลาดใน นอกจากนี้lQlc.BQ8แก้ไขข้อผิดพลาด @ Pietu1998 กล่าวถึงในขณะที่บันทึก 1 ไบต์ฉันคิดว่า
isaacg

3

Java, 241 90 89 ไบต์

int[]b(String s)throws Exception{return new int[]{s.length(),s.getBytes("utf8").length};}

รักที่คุณมี Java ให้ต่ำกว่า 100 ไบต์
GamrCorps

ดีก็เป็นเพียงวิธีการที่ ...
SuperJedi224

1
คุณอาจจะเปลี่ยนไปgetBytes("UTF-8") getBytes("utf8")แล้วทำไมthrows Exceptionล่ะ?
RAnders00

เนื่องจาก getBytes พ่นUnsupportedEncodingExceptionเมื่อคุณให้ชื่อการเข้ารหัสที่ไม่ถูกต้อง
SuperJedi224



2

R, 47 ไบต์

a<-commandArgs(TRUE);nchar(a,"c");nchar(a,"b")

การป้อนข้อมูล: (~R∊R∘.×R)/R←1↓ιR

เอาท์พุท:

[1] 17
[2] 27

หากไม่สามารถอนุญาตการพิมพ์หมายเลขบรรทัดข้างเอาท์พุทภายใต้ "รูปแบบใดก็ได้" catสามารถแก้ไขปัญหาได้:

R, 52 ไบต์

a<-commandArgs(TRUE);cat(nchar(a,"c"),nchar(a,"b"))

การป้อนข้อมูล: (~R∊R∘.×R)/R←1↓ιR

เอาท์พุท: 17 27


ในฐานะที่เป็นฟังก์ชัน 39 ไบต์:function(s)c(nchar(s,"c"),nchar(s,"b"))
Alex A.

1
นอกจากนี้ยังมีเพียงบางทั่วไป R เคล็ดลับการเล่นกอล์ฟ: คุณสามารถใช้Tในสถานที่ของTRUE, =ในสถานที่<-และการป้อนข้อมูลได้มาจากscan, readlineหรือซึ่งทั้งหมดนี้จะสั้นกว่าfunction commandArgs
Alex A.

1

ทางช้างเผือก 1.6.2 , 7 ไบต์ (ไม่มีการแข่งขัน)

':y!^P!

คำอธิบาย

'        ` read input from the command line
 :       ` duplicate the TOS
  y      ` push the length of the TOS
   !  !  ` output the TOS
    ^    ` pop the TOS
     P   ` push the length of the TOS in bytes

การใช้

./mw <path-to-code> -i <input>

ฉันทำเครื่องหมายว่าไม่แข่งขันเนื่องจากความท้าทายมาก่อนภาษา
Mego


1

Brainfuck, 163 ไบต์

,[>+<,]>[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[.[-]<]<

ด้วย linebreaks สำหรับการอ่าน:

,[>+<,]>
[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[
>++++++++++<[->-[>+>>]>[+[-<+>]>.
+>>]<<<<<]>[-]++++++++[<++++++>-
]>[<<+>>-]>[<<+>>-]<<]>]<[->>+++++
+++[<++++++>-]]<[.[-]<]<

ส่วนที่สำคัญที่สุดคือบรรทัดแรก จำนวนนี้นับจำนวนตัวอักษรที่ป้อน ส่วนที่เหลือเป็นเพียงขยะยาวที่ต้องใช้ในการพิมพ์ตัวเลขที่มากกว่า 9

แก้ไข: เนื่องจาก BF ไม่สามารถอินพุต / เอาต์พุตใด ๆ ได้ยกเว้นตัวเลข ASCII ตั้งแต่ 1-255 จึงไม่มีวิธีการวัด UTF-8 ตัวอักษร


ดูเหมือนว่าจะสามารถตีกอล์ฟได้มากกว่านี้ แต่มันคงเป็นไปไม่ได้ +1
wizzwizz4

0

ขี้ผึ้ง, 99 87 ไบต์

รุ่นกะทัดรัดยิ่งขึ้น 12 ไบต์สั้นกว่ารุ่นแรก:

p~5~q")~4~p")~7~g?<
>)'qq>@PPq>@Pp>Ag'd@{
     >@PPPq  @dNp"?{gAV_
     >@PPPP>@>?b>N{;

เช่นเดียวกับที่ง่ายต่อการติดตามเค้าโครงหกเหลี่ยม:

 p ~ 5 ~ q " ) ~ 4 ~ p " ) ~ 7 ~ g ? <
> ) ' q q > @ P P q > @ P p > A g ' d @ {
         > @ P P P q     @ d N p " ? { g A V _ 
        > @ P P P P > @ > ? b > N { ;

ส่งออกเป็นcharactersแล้วbytecountคั่นด้วยบรรทัดใหม่

ตัวอย่าง: อักษรตัวเล็ก ๆsที่จุดเริ่มต้นของบรรทัดเพียงบอกผู้ใช้ว่าโปรแกรมต้องการสตริงเป็นอินพุต

julia> beeswax("utf8bytecount.bswx")
s(~R∊R∘.×R)/R←1↓ιR
17
27
Program finished!

ตัวอย่างสตริงว่าง:

julia> beeswax("utf8bytecount.bswx")
s
0
0
Program finished!

Beeswax ผลักอักขระของสตริงที่ป้อนที่ STDIN ลงบนสแต็กโกลบอลซึ่งเขียนเป็นค่าของจุดโค้ด Unicode

เพื่อความเข้าใจที่ง่ายขึ้นต่อไปนี้เป็นโปรแกรมรุ่นที่ยังไม่ได้แก้ไขข้างต้น:

             >@{;    >@P@p >@PP@p>@P p
_VAg{?"pN>Ag"d?g~7~)"d~4~)"d~5~)"d@PPp
    ;{N< d?              <      < @PP<

ตัวอย่างนี้ตัวละครαจะถูกป้อนที่ STDIN (จุดรหัสU+03B1ทศนิยม: 945)

                                        gstack     lstack

_VA                                     [945,1]•   [0,0,0]•    enter string, push stack length on top of gstack
   g                                               [0,0,1]•    push gstack top value on top of local stack (lstack)
    {                                                          lstack 1st value to STDOUT (num. of characters)
     ?                                  [945]•                 pop gstack top value
      "                                                        skip next if lstack 1st >0
        N>                                                     print newline, redirect to right
          Ag                            [945,1]•   [0,0,1]•    push gstack length on top of gstack, push that value on lstack.
            "                                                  skip if lstack 1st > 0
              ?                         [945]•                 pop gstack top value
               g                                   [0,0,945]•  push gstack top value on lstack
                ~                                  [0,945,0]•  flip lstack 1st and 2nd
                 7                                 [0,945,7]•  lstack 1st=7
                  ~                                [0,7,945]•  flip lstack 1st and 2nd
                   )                               [0,7,7]•    lstack 1st = lstack 1st >>> 2nd  (LSR by 7)
                    "                                          skip next if top >0
                      ~4~)                         [0,0,0]•            flip,1st=4,flip,LSR by 4
                          "d                                   skip next if top >0... redirect to upper right
                           >@                                  redirect to right, flip lstack 1st and 3rd
                             PP@                   [2,0,0]•    increment lstack 1st twice, flip 1st and 3rd
                                p                              redirect to lower left
                                "                              (ignored instruction, not relevant)
         d?              <      <       []•                       redirect to left... pop gstack, redirect to upper right

         >Ag"d                          [0]•       [2,0,0]•    redir. right, push gstack length on gstack
                                                               push gstack top on lstack, skip next if lstack 1st > 0
                                                               redir. to upper right.
         >@                                        [0,0,2]•    redir right, flip lstack 1st/3rd
           {;                                                  output lstack 1st to STDOUT, terminate program

โดยทั่วไปโปรแกรมนี้จะตรวจสอบค่า codepoint แต่ละค่าสำหรับข้อ จำกัด codepoint codepoint ขนาด 1-byte, 2-byte, 3-byte และ 4-byte

หากnเป็นค่า codepoint แล้วข้อ จำกัด เหล่านี้สำหรับสตริง UTF-8 ที่เหมาะสมคือ:

codepoint 0...127         1-byte: n>>>7 = 0
          128...2047      2-byte: n>>>11= 0  → n>>>7>>>4
          2048...65535    3-byte: n>>>16= 0  → n>>>7>>>4>>>5
          65535...1114111 4-byte: the 3 byte check result is >0

คุณสามารถค้นหาตัวเลข7, 4และ5สำหรับคำแนะนำในการเปลี่ยนรหัสข้างต้น หากผลการตรวจสอบใน0ตัวนับ lstack จะเพิ่มขึ้นอย่างเหมาะสมเพื่อนับจำนวนไบต์ของสตริงที่ป้อน @PP...@สร้างเพิ่มเคาน์เตอร์ไบต์ หลังจากนับรวมแต่ละจุด Unicode ที่อยู่ด้านบนสุดจะถูกตอกจาก gstack จนกว่าจะว่างเปล่า จากนั้นนับไบต์จะถูกส่งออกไปยัง STDOUT และโปรแกรมสิ้นสุดลง

ไม่มีการตรวจสอบการเข้ารหัสที่ไม่เหมาะสมเช่นการเข้ารหัส ASCII ที่ยาวเกินไปและจุดรหัสผิดกฎหมายที่เกินกว่า0x10FFFFนั้น แต่ฉันคิดว่าไม่เป็นไร;)


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