COMP1521 2020T2 Q8 — Character encoding (UTF-8)
COMP1521 2020T2 Q8 · 10 marks · C
Topic: Character encoding (UTF-8) · Source: https://cgi.cse.unsw.edu.au/~cs1521/26T1/resources/practice_exams.html
Summary: Count and validate the UTF-8 characters in a file
We need to count the number of UTF-8 characters in a file,
and check that the file contains only valid UTF-8.
Write a C program, practice_q8.c ,
which takes a single filename as its argument,
counts the number of UTF-8 characters in the named file,
and prints one line of output containing that count.
Use the same format as the example below.
dcc practice_q8.c -o practice_q8
echo hello world >file1
./practice_q8 file1
file1: 12 UTF-8 characters
echo -e -n '\xF0\x90\x8D\x88' >file2
./practice_q8 file2
file2: 1 UTF-8 characters
echo -e -n '\x24\xC2\xA2\xE0\xA4\xB9' >file3
./practice_q8 file3
file3: 3 UTF-8 characters
./practice_q8 utf8.html
utf8.html: 7943 UTF-8 characters
If practice_q8.c reads a byte which is not valid UTF-8,
it should stop and print an error message
in the same format as the example below.
Note the error message includes
how many valid UTF-8 characters have been previously read.
echo -e -n '\x24\xC2\xA2\xE0\xA4\x09' >file4
./practice_q8 file4
file4: invalid UTF-8 after 2 valid UTF-8 characters
If the end of file is reached
before the completion of a UTF-8 character,
practice_q8.c should also print an error message;
for example:
echo -e -n '\x24\xC2\xA2\xE0\xA4' >file5
./practice_q8 file5
file5: invalid UTF-8 after 2 valid UTF-8 characters
A reminder of how UTF-8 is encoded:
#bytes
#bits
Byte 1
Byte 2
Byte 3
Byte 4
1
7
0xxxxxxx
-
-
-
2
11
110xxxxx
10xxxxxx
-
-
3
16
1110xxxx
10xxxxxx
10xxxxxx
-
4
21
11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
There is no supplied code for this question.
Only the specified error checking is required;
no additional error checking is required.
Your program can assume it is always given a single argument, the name of a file.
Your solution must be in C only.
You are not permitted to run external programs.
You are not permitted to use system, popen, posix_spawn, fork or exec.
🤖 Write a C program.argv[1]is a filename. Count the UTF-8 characters; if you hit an invalid sequence (bad lead byte, bad continuation, or EOF mid-character) stop and print<filename>: invalid UTF-8 after <N> valid UTF-8 characters; otherwise print<filename>: <K> UTF-8 characters.
Verified on the sandbox, cross-checked against an independent decoder, and reproduces every official example (raw-byte fixtures).
Samples
file1: 12 UTF-8 characters
file2: 1 UTF-8 characters
file3: 3 UTF-8 characters