ShiftJIS::String - functions to manipulate Shift-JIS strings
use ShiftJIS::String;
ShiftJIS::String::substr($str, ShiftJIS::String::index($str, $substr));
This module provides some functions which emulate
the corresponding CORE functions and helps someone
to manipulate multiple-byte character sequences in Shift-JIS.
* 'Hankaku' and 'Zenkaku' mean 'halfwidth' and 'fullwidth' characters in Japanese, respectively.
issjis(LIST)Returns false if LIST includes one (or more) invalid string.
length(STRING)
strrev(STRING)STRING
but in the opposite order.
index(STRING, SUBSTR)index(STRING, SUBSTR, POSITION)SUBSTR in STRING at or after POSITION.
If POSITION is omitted, starts searching
from the beginning of the string.
If the substring is not found, returns -1.
rindex(STRING, SUBSTR)rindex(STRING, SUBSTR, POSITION)SUBSTR in STRING.
If POSITION is specified, returns the last
occurrence at or before POSITION.
If the substring is not found, returns -1.
strspn(STRING, SEARCHLIST)If STRING consists of the characters in SEARCHLIST,
the returned value must equal the length of STRING.
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
strspn("+0.12345*12", "+-.0123456789");
# returns 8 (at '*')
strcspn(STRING, SEARCHLIST)SEARCHLIST.
If STRING does not contain any character in SEARCHLIST,
the returned value must equal the length of STRING.
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
rspan(STRING, SEARCHLIST)SEARCHLIST.
If such a character is found, returns the next position to it;
otherwise (any character in STRING is contained in SEARCHLIST),
it returns 0 (as the first position of the string).
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
rcspan(STRING, SEARCHLIST)SEARCHLIST.
If such a character is found, returns the next position to it;
otherwise (any character in STRING is not contained in SEARCHLIST),
it returns 0 (as the first position of the string).
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
trim(STRING)trim(STRING, SEARCHLIST)trim(STRING, SEARCHLIST, USE_COMPLEMENT)SEARCHLIST from the beginning and the end
of STRING and the returns the result.
If USE_COMPLEMENT is true, erases characters
that are not contained in SEARCHLIST.
If SEARCHLIST is omitted (or undef),
it is used the list of whitespace characters
i.e., "\t", "\n", "\r", "\f", "\x20" (SP),
and "\x81\x40" (IDSP).
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange(),
like trim($string, mkrange("\x00-\x20")).
ltrim(STRING)ltrim(STRING, SEARCHLIST)ltrim(STRING, SEARCHLIST, USE_COMPLEMENT)SEARCHLIST from the beginning
of STRING and the returns the result.
If USE_COMPLEMENT is true, erases characters
that are not contained in SEARCHLIST.
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
rtrim(STRING)rtrim(STRING, SEARCHLIST)rtrim(STRING, SEARCHLIST, USE_COMPLEMENT)SEARCHLIST from the end
of STRING and the returns the result.
If USE_COMPLEMENT is true, erases characters
that are not contained in SEARCHLIST.
While SEARCHLIST is not aware of character ranges,
you can utilize mkrange().
substr(STRING or SCALAR REF, OFFSET)substr(STRING or SCALAR REF, OFFSET, LENGTH)substr(SCALAR, OFFSET, LENGTH, REPLACEMENT)CORE::substr, but
using character semantics of Shift-JIS.
If the REPLACEMENT as the fourth parameter is specified, replaces
parts of the SCALAR and returns what was there before.
You can utilize the lvalue reference, returned if a reference to a scalar variable is used as the first argument.
${ &substr(\$str,$off,$len) } = $replace;
works like
CORE::substr($str,$off,$len) = $replace;
The returned lvalue is not aware of Shift-JIS, then successive assignment may cause unexpected results.
Get lvalue before any assignment if you are not sure.
strsplit(SEPARATOR, STRING)strsplit(SEPARATOR, STRING, LIMIT)CORE::split, but splits on the SEPARATOR string,
not by a pattern.
If not in list context, only return the number of fields found,
but does not split into the @_ array.
If an empty string is specified as SEPARATOR, splits the specified string
into characters (similarly to CORE::split //, STRING, LIMIT).
strsplit('', 'This is Perl.', 7);
# ('T', 'h', 'i', 's', ' ', 'i', 's Perl.')
If an undefined value is specified as SEPARATOR, splits the specified string
on whitespace characters (including IDEOGRAPHIC SPACE).
Leading whitespace characters do not produce any field
(similarly to CORE::split ' ', STRING, LIMIT).
strsplit(undef, ' This is Perl.');
# ('This', 'is', 'Perl.')
strcmp(LEFT-STRING, RIGHT-STRING)1 (when LEFT-STRING is greater than RIGHT-STRING)
or 0 (when LEFT-STRING is equal to RIGHT-STRING)
or -1 (when LEFT-STRING is lesser than RIGHT-STRING).
The order is roughly as shown the following list.
JIS X 0201 Roman, JIS X 0201 Kana, then JIS X 0208 Kanji (Zenkaku).
For example,
0x41 as 'A' is lesser than 0xB1 (HANKAKU KATAKANA A).
0xB1 is lesser than 0x8341 (KATAKANA A).
0x8341 is lesser than 0x8383 (KATAKANA SMALL YA).
0x8383 is lesser than 0x83B1 (GREEK CAPITAL TAU).
Caveat!
Compare the 2nd and the 4th examples.
Byte "\xB1" is lesser than byte "\x83" as the leading bytes;
while greater as the trailing bytes.
Shortly, the ordering as binary is broken for the Shift-JIS codepoint order.
strEQ(LEFT-STRING, RIGHT-STRING)LEFT-STRING is equal to RIGHT-STRING.
Note: strEQ is an expensive equivalence of the CORE's eq operator.
strNE(LEFT-STRING, RIGHT-STRING)LEFT-STRING is not equal to RIGHT-STRING.
Note: strNE is an expensive equivalence of the CORE's ne operator.
strLT(LEFT-STRING, RIGHT-STRING)LEFT-STRING is lesser than RIGHT-STRING.
strLE(LEFT-STRING, RIGHT-STRING)LEFT-STRING is lesser than or equal to
RIGHT-STRING.
strGT(LEFT-STRING, RIGHT-STRING)LEFT-STRING is greater than RIGHT-STRING.
strGE(LEFT-STRING, RIGHT-STRING)LEFT-STRING is greater than or equal to
RIGHT-STRING.
strxfrm(STRING)CORE:: cmp can be used
for binary comparisons (NOT the length of the transformed string).
I.e. strxfrm($a) cmp strxfrm($b) is equivalent to strcmp($a, $b),
as long as your cmp doesn't use any locale other than that of Perl.
mkrange(EXPR, EXPR)A character range is specified with a '-' (HYPHEN-MINUS).
The backslashed combinations '\-' and '\\' are used
instead of the characters '-' and '\', respectively.
The hyphen at the beginning or end of the range is
also evaluated as the hyphen itself.
For example, mkrange('+\-0-9a-fA-F') returns
('+', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F').
The order of Shift-JIS characters is:
0x00 .. 0x7F, 0xA1 .. 0xDF, 0x8140 .. 0x9FFC, 0xE040 .. 0xFCFC.
If true value is specified as the second parameter,
Reverse character ranges such as '9-0', 'Z-A' can be used;
otherwise, reverse character ranges are croaked.
strtr(STRING or SCALAR REF, SEARCHLIST, REPLACEMENTLIST)strtr(STRING or SCALAR REF, SEARCHLIST, REPLACEMENTLIST, MODIFIER)strtr(STRING or SCALAR REF, SEARCHLIST, REPLACEMENTLIST, MODIFIER, PATTERN)strtr(STRING or SCALAR REF, SEARCHLIST, REPLACEMENTLIST, MODIFIER, PATTERN, TOPATTERN)If a reference to a scalar variable is specified as the first argument, returns the number of characters replaced or deleted; otherwise, returns the transliterated string and the specified string is unaffected.
SEARCHLIST and REPLACEMENTLIST
Character ranges (internally utilizing mkrange()) are supported.
If the REPLACEMENTLIST is empty, the SEARCHLIST is replicated.
If the replacement list is shorter than the search list, the final character in the replacement list is replicated till it is long enough (but differently works when the 'd' modifier is used).
MODIFIER
c Complement the SEARCHLIST.
d Delete found but unreplaced characters.
s Squash duplicate replaced characters.
h Returns a hash (or a hashref in scalar context) of histogram
R No use of character ranges.
r Allows to use reverse character ranges.
o Caches the conversion table internally.
strtr(\$str, " \x81\x40\n\r\t\f", '', 'd');
# deletes all whitespace characters including IDEOGRAPHIC SPACE.
If 'h' modifier is specified, returns a hash (or a hashref in scalar
context) of histogram (key: a character as a string, value: count),
whether the first argument is a reference or not.
If you want to get the histogram and the modified string at once,
pass a reference as the first argument and use its value after.
If 'R' modifier is specified, '-' is not evaluated as a meta character
but HYPHEN-MINUS itself like in tr'''. Compare:
strtr("90 - 32 = 58", "0-9", "A-J");
# output: "JA - DC = FI"
strtr("90 - 32 = 58", "0-9", "A-J", "R");
# output: "JA - 32 = 58"
# cf. ($str = "90 - 32 = 58") =~ tr'0-9'A-J';
# '0' to 'A', '-' to '-', and '9' to 'J'.
If 'r' modifier is specified, you are allowed to use reverse
character ranges. For example, strtr($str, "0-9", "9-0", "r")
is equivalent to strtr($str, "0123456789", "9876543210").
PATTERN and TOPATTERN
By use of PATTERN and TOPATTERN, you can transliterate the string
using lists containing some multi-character substrings.
If called with four arguments, SEARCHLIST, REPLACEMENTLIST,
and STRING are splited characterwise;
If called with five arguments, a multi-character substring
that matchs PATTERN in SEARCHLIST, REPLACEMENTLIST, or STRING
is regarded as an transliteration unit.
If both PATTERN and TOPATTERN are specified,
a multi-character substring
either that matchs PATTERN in SEARCHLIST, or STRING,
or that matchs TOPATTERN in REPLACEMENTLIST
is regarded as an transliteration unit.
print strtr(
"Caesar Aether Goethe",
"aeoeueAeOeUe",
"äööÄÖÜ",
"",
"[aouAOU]e",
"&[aouAOU]uml;");
# output: Cäsar Äther Göthe
LISTs as Anonymous Arrays
Instead of specification of PATTERN and TOPATTERN, you can use
anonymous arrays as SEARCHLIST and/or REPLACEMENTLIST as follows.
print strtr(
"Caesar Aether Goethe",
[qw/ae oe ue Ae Oe Ue/],
[qw/ä ö ö Ä Ö Ü/]
);
Caching the conversion table
If 'o' modifier is specified, the conversion table is cached internally.
e.g.
foreach (@strings) {
print strtr($_, $from_list, $to_list, 'o');
}
will be almost as efficient as this:
$closure = trclosure($from_list, $to_list);
foreach (@strings) {
print &$closure($_);
}
You can use whichever you like.
Without 'o',
foreach (@strings) {
print strtr($_, $from_list, $to_list);
}
will be very slow since the conversion table is made whenever the function is called.
trclosure(SEARCHLIST, REPLACEMENTLIST)trclosure(SEARCHLIST, REPLACEMENTLIST, MODIFIER)trclosure(SEARCHLIST, REPLACEMENTLIST, MODIFIER, PATTERN)trclosure(SEARCHLIST, REPLACEMENTLIST, MODIFIER, PATTERN, TOPATTERN)The functionality of the closure made by trclosure() is equivalent
to that of strtr(). Frankly speaking, the strtr() calls
trclosure() internally and uses the returned closure.
toupper(STRING)toupper(SCALAR REF)STRING.
Converts only half-width Latin characters a-z to A-Z.
If a reference of scalar variable is specified as the first argument, the string referred to it is uppercased and the number of characters replaced is returned.
tolower(STRING)tolower(SCALAR REF)STRING.
Converts only half-width Latin characters A-Z to a-z.
If a reference of scalar variable is specified as the first argument, the string referred to it is lowercased and the number of characters replaced is returned.
If a reference to a scalar variable is specified as the first argument, the string referred to it is converted and the number of characters replaced is returned. Otherwise, returns a string converted and the specified string is unaffected.
1.
Similarly, the conversion between hiragana VU, represented by
two characters (hiragana U + voiced mark), and katakana VU
or halfwidth katakana VU is counted as 1.
Conversion concerning halfwidth katakana includes halfwidth symbols:
HALFWIDTH IDEOGRAPHIC FULL STOP, HALFWIDTH LEFT CORNER BRACKET,
HALFWIDTH RIGHT CORNER BRACKET, HALFWIDTH IDEOGRAPHIC COMMA,
HALFWIDTH KATAKANA MIDDLE DOT,
HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK,
HALFWIDTH KATAKANA VOICED SOUND MARK,
HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK.
Conversion between hiragana and katakana includes those between
hiragana iteration marks and katakana iteration marks.
Hiragana WI, WE, small WA and katakana WI, WE, small WA, small KA, small
KE will be regarded as hiragana I, E, WA and katakana I, E, WA, KA, KE
if the fallback conversion is necessary.
kanaH2Z(STRING)kanaH2Z(SCALAR REF)kataH2Z(STRING)kataH2Z(SCALAR REF)hiraH2Z(STRING)hiraH2Z(SCALAR REF)kataZ2H(STRING)kataZ2H(SCALAR REF)kanaZ2H(STRING)kanaZ2H(SCALAR REF)hiraZ2H(STRING)hiraZ2H(SCALAR REF)hiXka(STRING)hiXka(SCALAR REF)hi2ka(STRING)hi2ka(SCALAR REF)ka2hi(STRING)ka2hi(SCALAR REF)
If a reference to a scalar variable is specified as the first argument, the string referred to it is converted and the number of characters replaced is returned. Otherwise, returns a string converted and the specified string is unaffected.
spaceH2Z(STRING)spaceH2Z(SCALAR REF)"\x20" (space) to "\x81\x40" (ideographic space).
spaceZ2H(STRING)spaceZ2H(SCALAR REF)"\x81\x40" (ideographic space) to "\x20" (space).
A legal Shift-JIS character in this module must match the following regular expression:
[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]
Any string from an external source should be checked by issjis()
function, excepting you know it is surely coded in Shift-JIS.
Use of an illegal Shift-JIS string may lead to odd results.
Some Shift-JIS double-byte characters have a trailing byte
in the range of [\x40-\x7E], viz.,
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
The Perl lexer (parhaps) doesn't take any care to these bytes,
so they sometimes make trouble.
For example, the quoted literal ending with a double-byte character
whose trailing byte is 0x5C causes a fatal error,
since the trailing byte 0x5C backslashes the closing quote.
Such a problem doesn't arise when the string is gotten from any external resource. But writing the script containing Shift-JIS double-byte characters needs the greatest care.
The use of single-quoted heredoc, << '',
or \xhh meta characters is recommended
in order to define a Shift-JIS string literal.
The safe ASCII-graphic characters, [\x21-\x3F], are:
!"#$%&'()*+,-./0123456789:;<=>?
They are preferred as the delimiter of quote-like operators.
This module supposes $[ is always equal to 0, never 1.
SADAHIRO Tomoyuki <SADAHIRO@cpan.org>
Copyright(C) 2001-2007, SADAHIRO Tomoyuki. Japan. All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.