mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/json/lib/json/pure.rb (module JSON): remove Iconv dependency.
* ext/json/lib/json/pure/generator.rb (utf8_to_json): process as binary and remove Iconv dependency. * ext/json/lib/json/pure/parser.rb (parse_string): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19666 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7e752551bb
commit
be93ac50db
4 changed files with 30 additions and 65 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Fri Oct 3 19:33:21 2008 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/json/lib/json/pure.rb (module JSON): remove Iconv dependency.
|
||||||
|
|
||||||
|
* ext/json/lib/json/pure/generator.rb (utf8_to_json): process as
|
||||||
|
binary and remove Iconv dependency.
|
||||||
|
|
||||||
|
* ext/json/lib/json/pure/parser.rb (parse_string): ditto.
|
||||||
|
|
||||||
Fri Oct 3 14:04:05 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
Fri Oct 3 14:04:05 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* win32/{configure.bat,setup.mak,Makefile.sub): add --program-prefix
|
* win32/{configure.bat,setup.mak,Makefile.sub): add --program-prefix
|
||||||
|
|
|
@ -3,59 +3,6 @@ require 'json/pure/parser'
|
||||||
require 'json/pure/generator'
|
require 'json/pure/generator'
|
||||||
|
|
||||||
module JSON
|
module JSON
|
||||||
begin
|
|
||||||
require 'iconv'
|
|
||||||
# An iconv instance to convert from UTF8 to UTF16 Big Endian.
|
|
||||||
UTF16toUTF8 = Iconv.new('utf-8', 'utf-16be') # :nodoc:
|
|
||||||
# An iconv instance to convert from UTF16 Big Endian to UTF8.
|
|
||||||
UTF8toUTF16 = Iconv.new('utf-16be', 'utf-8') # :nodoc:
|
|
||||||
UTF8toUTF16.iconv('no bom')
|
|
||||||
rescue Errno::EINVAL, Iconv::InvalidEncoding
|
|
||||||
# Iconv doesn't support big endian utf-16. Let's try to hack this manually
|
|
||||||
# into the converters.
|
|
||||||
begin
|
|
||||||
old_verbose, $VERBSOSE = $VERBOSE, nil
|
|
||||||
# An iconv instance to convert from UTF8 to UTF16 Big Endian.
|
|
||||||
UTF16toUTF8 = Iconv.new('utf-8', 'utf-16') # :nodoc:
|
|
||||||
# An iconv instance to convert from UTF16 Big Endian to UTF8.
|
|
||||||
UTF8toUTF16 = Iconv.new('utf-16', 'utf-8') # :nodoc:
|
|
||||||
UTF8toUTF16.iconv('no bom')
|
|
||||||
if UTF8toUTF16.iconv("\xe2\x82\xac") == "\xac\x20"
|
|
||||||
swapper = Class.new do
|
|
||||||
def initialize(iconv) # :nodoc:
|
|
||||||
@iconv = iconv
|
|
||||||
end
|
|
||||||
|
|
||||||
def iconv(string) # :nodoc:
|
|
||||||
result = @iconv.iconv(string)
|
|
||||||
JSON.swap!(result)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
UTF8toUTF16 = swapper.new(UTF8toUTF16) # :nodoc:
|
|
||||||
end
|
|
||||||
if UTF16toUTF8.iconv("\xac\x20") == "\xe2\x82\xac"
|
|
||||||
swapper = Class.new do
|
|
||||||
def initialize(iconv) # :nodoc:
|
|
||||||
@iconv = iconv
|
|
||||||
end
|
|
||||||
|
|
||||||
def iconv(string) # :nodoc:
|
|
||||||
string = JSON.swap!(string.dup)
|
|
||||||
@iconv.iconv(string)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
UTF16toUTF8 = swapper.new(UTF16toUTF8) # :nodoc:
|
|
||||||
end
|
|
||||||
rescue Errno::EINVAL, Iconv::InvalidEncoding
|
|
||||||
raise MissingUnicodeSupport, "iconv doesn't seem to support UTF-8/UTF-16 conversions"
|
|
||||||
ensure
|
|
||||||
$VERBOSE = old_verbose
|
|
||||||
end
|
|
||||||
rescue LoadError
|
|
||||||
raise MissingUnicodeSupport,
|
|
||||||
"iconv couldn't be loaded, which is required for UTF-8/UTF-16 conversions"
|
|
||||||
end
|
|
||||||
|
|
||||||
# Swap consecutive bytes of _string_ in place.
|
# Swap consecutive bytes of _string_ in place.
|
||||||
def self.swap!(string) # :nodoc:
|
def self.swap!(string) # :nodoc:
|
||||||
0.upto(string.size / 2) do |i|
|
0.upto(string.size / 2) do |i|
|
||||||
|
|
|
@ -41,6 +41,7 @@ module JSON
|
||||||
# UTF16 big endian characters as \u????, and return it.
|
# UTF16 big endian characters as \u????, and return it.
|
||||||
def utf8_to_json(string) # :nodoc:
|
def utf8_to_json(string) # :nodoc:
|
||||||
string = string.gsub(/["\\\/\x0-\x1f]/) { MAP[$&] }
|
string = string.gsub(/["\\\/\x0-\x1f]/) { MAP[$&] }
|
||||||
|
string.force_encoding(Encoding::ASCII_8BIT)
|
||||||
string.gsub!(/(
|
string.gsub!(/(
|
||||||
(?:
|
(?:
|
||||||
[\xc2-\xdf][\x80-\xbf] |
|
[\xc2-\xdf][\x80-\xbf] |
|
||||||
|
@ -50,12 +51,10 @@ module JSON
|
||||||
[\x80-\xc1\xf5-\xff] # invalid
|
[\x80-\xc1\xf5-\xff] # invalid
|
||||||
)/nx) { |c|
|
)/nx) { |c|
|
||||||
c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
|
c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
|
||||||
s = JSON::UTF8toUTF16.iconv(c).unpack('H*')[0]
|
c = c.unpack("U*")[0]
|
||||||
s.gsub!(/.{4}/n, '\\\\u\&')
|
c > 0xFFFF ? ('\uD%03X\uD%03X' % [0x7C0+c/1024, 0xC00+c%1024]) : ('\u%04X'%c)
|
||||||
}
|
}
|
||||||
string
|
string
|
||||||
rescue Iconv::Failure => e
|
|
||||||
raise GeneratorError, "Caught #{e.class}: #{e}"
|
|
||||||
end
|
end
|
||||||
module_function :utf8_to_json
|
module_function :utf8_to_json
|
||||||
|
|
||||||
|
|
|
@ -126,20 +126,30 @@ module JSON
|
||||||
if u = UNESCAPE_MAP[$&[1]]
|
if u = UNESCAPE_MAP[$&[1]]
|
||||||
u
|
u
|
||||||
else # \uXXXX
|
else # \uXXXX
|
||||||
bytes = ''
|
res = []
|
||||||
i = 0
|
stack = nil
|
||||||
while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
|
[c.delete!('\\\\u')].pack("H*").unpack("n*").each do |c|
|
||||||
bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
|
case c
|
||||||
i += 1
|
when 0xD800..0xDBFF
|
||||||
|
raise JSON::ParserError, "partial character in source" if stack
|
||||||
|
stack = c
|
||||||
|
when 0xDC00..0xDFFF
|
||||||
|
raise JSON::ParserError,
|
||||||
|
"partial character in source" unless (0xD800..0xDBFF).include?(stack)
|
||||||
|
res << (stack << 10) - 0x35fdc00 + c
|
||||||
|
stack = nil
|
||||||
|
else
|
||||||
|
raise JSON::ParserError, "partial character in source" if stack
|
||||||
|
res << c
|
||||||
end
|
end
|
||||||
JSON::UTF16toUTF8.iconv(bytes)
|
end
|
||||||
|
raise JSON::ParserError, "partial character in source" if stack
|
||||||
|
res.pack("U*")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
UNPARSED
|
UNPARSED
|
||||||
end
|
end
|
||||||
rescue Iconv::Failure => e
|
|
||||||
raise GeneratorError, "Caught #{e.class}: #{e}"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def parse_value
|
def parse_value
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue