🌊
【Zig】UTF-8 文字列のバイト数、文字数を求める
const
で文字列リテラルを宣言する。バイト数は len
で求められる。文字数は std.unicode
の utf8CountCodepoints
で求められる
const std = @import("std");
const print = std.debug.print;
const unicode = std.unicode;
pub fn main() !void {
const s = "あいうえお";
print("{s}\n", .{s});
print("バイト数: {}\n", .{s.len});
const len = try unicode.utf8CountCodepoints(s);
print("文字数: {}\n", .{len});
}
utf8ByteSequenceLength
を使って先行バイトをもとに1文字ずつバイトサイズを計算することで文字数を求めることができる。
const std = @import("std");
const print = std.debug.print;
pub fn main() !void {
const bytes = "あいうえお";
var i: u32 = 0;
var size: u8 = 0;
var length:u32 = 0;
while (i < byte.len) {
size = try std.unicode.utf8ByteSequenceLength(bytes[i]);
i += size;
length += 1;
}
print("{d}\n", .{ length });
}
イテレーターを使って文字数を数えることもできる。nextCodepointSlice
もしくは nextCodepoint
を使う。
const std = @import("std");
const print = std.debug.print;
const unicode = std.unicode;
pub fn main() !void {
const s = "あいうえお";
var count:u8 = 0;
var it = (try unicode.Utf8View.init(s)).iterator();
while (it.nextCodepointSlice()) |_| {
count += 1;
}
print("文字数: {x}\n", .{count});
}
Discussion