From 05210846e41ea1e3cfc1c8e91834951f642348f7 Mon Sep 17 00:00:00 2001 From: w0rp Date: Mon, 10 Aug 2020 02:03:41 +0100 Subject: [PATCH] Fix #3278 - Handle UTF-8 in URI encoding/decoding --- autoload/ale/uri.vim | 15 ++++++++++++--- test/test_path_uri.vader | 9 +++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/autoload/ale/uri.vim b/autoload/ale/uri.vim index 934637d9..e71c6340 100644 --- a/autoload/ale/uri.vim +++ b/autoload/ale/uri.vim @@ -1,9 +1,18 @@ -" This probably doesn't handle Unicode characters well. +function! s:EncodeChar(char) abort + let l:result = '' + + for l:index in range(strlen(a:char)) + let l:result .= printf('%%%02x', char2nr(a:char[l:index])) + endfor + + return l:result +endfunction + function! ale#uri#Encode(value) abort return substitute( \ a:value, \ '\([^a-zA-Z0-9\\/$\-_.!*''(),]\)', - \ '\=printf(''%%%02x'', char2nr(submatch(1)))', + \ '\=s:EncodeChar(submatch(1))', \ 'g' \) endfunction @@ -12,7 +21,7 @@ function! ale#uri#Decode(value) abort return substitute( \ a:value, \ '%\(\x\x\)', - \ '\=nr2char(''0x'' . submatch(1))', + \ '\=printf("%c", str2nr(submatch(1), 16))', \ 'g' \) endfunction diff --git a/test/test_path_uri.vader b/test/test_path_uri.vader index cc2287cb..0f2cba7e 100644 --- a/test/test_path_uri.vader +++ b/test/test_path_uri.vader @@ -1,3 +1,6 @@ +Before: + scriptencoding utf-8 + Execute(ale#path#ToURI should work for Windows paths): AssertEqual 'file:///C:/foo/bar/baz.tst', ale#path#ToURI('C:\foo\bar\baz.tst') AssertEqual 'foo/bar/baz.tst', ale#path#ToURI('foo\bar\baz.tst') @@ -62,3 +65,9 @@ Execute(ale#path#ToURI should percent encode unsafe characters): Execute(ale#path#FromURI should decode percent encodings): AssertEqual ' +:?&=', ale#path#FromURI('%20%2b%3a%3f%26%3d') + +Execute(ale#path#ToURI should handle UTF-8): + AssertEqual 'file:///T%c3%a9l%c3%a9chargement', ale#path#ToURI('/Téléchargement') + +Execute(ale#path#FromURI should handle UTF-8): + AssertEqual '/Téléchargement', ale#path#FromURI('file:///T%C3%A9l%C3%A9chargement')