Actions
Bug #20929
openTestTime have an assertion different from current implementation.
Description
test/ruby/test_time.rb have following assersion function.
def assert_zone_encoding(time)
zone = time.zone
assert_predicate(zone, :valid_encoding?)
if zone.ascii_only?
assert_equal(Encoding::US_ASCII, zone.encoding)
else
enc = Encoding.default_internal || Encoding.find('locale')
assert_equal(enc, zone.encoding)
end
end
In current implementation, Time#zone are returned in US_ASCII or locale encoding, which does not seem to take into account the default_internal.
C:\>ruby -e "puts Time.now.zone"
東京 (標準時)
C:\>ruby -e "puts Time.now.zone.encoding"
Windows-31J
C:\>ruby -EWindows-31J:UTF-8 -e "puts Time.now.zone"
東京 (標準時)
C:\>ruby -EWindows-31J:UTF-8 -e "puts Time.now.zone.encoding"
Windows-31J
Updated by nobu (Nobuyoshi Nakada) about 1 hour ago
- Description updated (diff)
Indeed, that assertion is incorrect.
But the locale is not the correct/expected encoding always on Windows.
For instance, in Japanese edition, tm_zone
is always CP932.
> chcp.com 932
現在のコード ページ: 932
> ruby -e "p Encoding.find('locale'), (z = Time.now.zone), z.encoding"
#<Encoding:Windows-31J>
"\x{938C}\x{8B9E} (\x{9557}\x{8F80}\x{8E9E})"
#<Encoding:Windows-31J>
Even when locale (active codepage) is changed.
> chcp.com 437
Active code page: 437
> ruby -e "p Encoding.find('locale'), (z = Time.now.zone), z.encoding"
#<Encoding:IBM437>
"\x93\x8C\x8B\x9E (\x95W\x8F\x80\x8E\x9E)"
#<Encoding:IBM437>
And of course regardless the internal encoding.
> ruby -Ecp932 -e "p Encoding.find('locale'), (z = Time.now.zone), z.encoding"
#<Encoding:IBM437>
"\x93\x8C\x8B\x9E (\x95W\x8F\x80\x8E\x9E)"
#<Encoding:IBM437>
I don't think there is the API to obtain what codepage it is encoded.
Maybe we should use the W API and encode it in UTF-8 ranter than the locale.
@usa (Usaku NAKAMURA), what do you think?
Actions
Like0
Like0