Ruby - 全角文字を2バイト換算して指定バイト数で切り捨て!
Updated:
Ruby で文字列内の全角文字を2バイト換算し、指定バイト数で切り捨てる方法についての記録です。
(正確には、「全角文字」ではなく、2バイト以上の文字)
0. 前提条件
- LMDE 2 (Linux Mint Debian Edition 2; 64bit) での作業を想定。
- Ruby 2.4.3 (エンコード:UTF-8)での作業を想定。
- String クラスを拡張して実装する。
1. サンプルスクリプトの作成
- Shebang ストリング(1行目)では、フルパスでコマンド指定している。(当方の慣習)
- 切り捨てたたことが分かるよう文字を設定することも可能にしている。
File: str_trunc.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#! /usr/local/bin/ruby
#**************************************************************
# 全角文字を2byte換算し、指定バイトで切り捨て(省略文字設定可)
# ※正確には、「全角文字」ではなく1byte超の文字
#**************************************************************
class String
def trunc(trunc_at, om = "")
om_size = (om.bytesize - om.size) / 2 + om.size
if size == bytesize
return size <= trunc_at ? self : "#{self[0, trunc_at - om_size]}#{om}"
end
return self if (self.bytesize - self.size) / 2 + self.size <= trunc_at
size.times do |i|
str_size = (self[0..i].bytesize - self[0..i].size) / 2 + self[0..i].size
case
when str_size < trunc_at - om_size; next
when str_size == trunc_at - om_size; return "#{self[0..i]}#{om}"
else; return "#{self[0..(i - 1)]}#{om}"
end
end
return self
end
end
str = "abcdefg"
puts "str = #{str}"
puts "str.trunc(5) = #{str.trunc(5)}"
puts "str.trunc(6) = #{str.trunc(6)}"
puts "str.trunc(7) = #{str.trunc(7)}"
puts "str.trunc(8) = #{str.trunc(8)}"
puts "str.trunc(5, \"...\") = #{str.trunc(5, "...")}"
puts "str.trunc(6, \"...\") = #{str.trunc(6, "...")}"
puts "str.trunc(7, \"...\") = #{str.trunc(7, "...")}"
puts "str.trunc(8, \"...\") = #{str.trunc(8, "...")}"
puts
str = "AあBいCうDえEお"
puts "str = #{str}"
puts "str.trunc(12) = #{str.trunc(12)}"
puts "str.trunc(13) = #{str.trunc(13)}"
puts "str.trunc(14) = #{str.trunc(14)}"
puts "str.trunc(15) = #{str.trunc(15)}"
puts "str.trunc(16) = #{str.trunc(16)}"
puts "str.trunc(12, \"...\") = #{str.trunc(12, "...")}"
puts "str.trunc(13, \"...\") = #{str.trunc(13, "...")}"
puts "str.trunc(14, \"...\") = #{str.trunc(14, "...")}"
puts "str.trunc(15, \"...\") = #{str.trunc(15, "...")}"
puts "str.trunc(16, \"...\") = #{str.trunc(16, "...")}"
puts "str.trunc(12, \"(続く)\") = #{str.trunc(12, "(続く)")}"
puts "str.trunc(13, \"(続く)\") = #{str.trunc(13, "(続く)")}"
puts "str.trunc(14, \"(続く)\") = #{str.trunc(14, "(続く)")}"
puts "str.trunc(15, \"(続く)\") = #{str.trunc(15, "(続く)")}"
puts "str.trunc(16, \"(続く)\") = #{str.trunc(16, "(続く)")}"
2. サンプルスクリプトの実行
まず、実行権限を付与。
$ chmod +x str_trunc.rb
そして、実行。
$ ./str_trunc.rb
str = abcdefg
str.trunc(5) = abcde
str.trunc(6) = abcdef
str.trunc(7) = abcdefg
str.trunc(8) = abcdefg
str.trunc(5, "...") = ab...
str.trunc(6, "...") = abc...
str.trunc(7, "...") = abcdefg
str.trunc(8, "...") = abcdefg
str = AあBいCうDえEお
str.trunc(12) = AあBいCうDえ
str.trunc(13) = AあBいCうDえE
str.trunc(14) = AあBいCうDえE
str.trunc(15) = AあBいCうDえEお
str.trunc(16) = AあBいCうDえEお
str.trunc(12, "...") = AあBいCう...
str.trunc(13, "...") = AあBいCうD...
str.trunc(14, "...") = AあBいCうD...
str.trunc(15, "...") = AあBいCうDえEお
str.trunc(16, "...") = AあBいCうDえEお
str.trunc(12, "(続く)") = AあBい(続く)
str.trunc(13, "(続く)") = AあBいC(続く)
str.trunc(14, "(続く)") = AあBいC(続く)
str.trunc(15, "(続く)") = AあBいCうDえEお
str.trunc(16, "(続く)") = AあBいCうDえEお
Twitter でツイートする際の文字数計算等に利用できるでしょう。
以上。
Comments