diff --git a/src/plugins/perl/weechat-perl-api.c b/src/plugins/perl/weechat-perl-api.c
index 3578e9f..beca0d9 100644
--- a/src/plugins/perl/weechat-perl-api.c
+++ b/src/plugins/perl/weechat-perl-api.c
@@ -64,6 +64,7 @@
     if (__string)                                                       \
     {                                                                   \
         XST_mPV (0, __string);                                          \
+        SvUTF8_on (ST (0));                                             \
         XSRETURN (1);                                                   \
     }                                                                   \
     XST_mPV (0, "");                                                    \
@@ -72,6 +73,7 @@
     if (__string)                                                       \
     {                                                                   \
         XST_mPV (0, __string);                                          \
+        SvUTF8_on (ST (0));                                             \
         free (__string);                                                \
         XSRETURN (1);                                                   \
     }                                                                   \
diff --git a/src/plugins/perl/weechat-perl.c b/src/plugins/perl/weechat-perl.c
index 785733a..6845590 100644
--- a/src/plugins/perl/weechat-perl.c
+++ b/src/plugins/perl/weechat-perl.c
@@ -32,6 +32,8 @@
 #include "weechat-perl-api.h"
 
 
+#define UTF8_HASH_KEY -
+
 WEECHAT_PLUGIN_NAME(PERL_PLUGIN_NAME);
 WEECHAT_PLUGIN_DESCRIPTION(N_("Support of perl scripts"));
 WEECHAT_PLUGIN_AUTHOR("Sebastien Helleu <flashcode@flashtux.org>");
@@ -104,7 +106,7 @@ weechat_perl_hashtable_map_cb (void *data,
 
     hash = (HV *)data;
 
-    (void) hv_store (hash, key, strlen (key), newSVpv (value, 0), 0);
+    (void) hv_store (hash, key, UTF8_HASH_KEY strlen (key), newSVpvn_utf8 (value, strlen (value), TRUE), 0);
 }
 
 /*
@@ -225,7 +227,7 @@ weechat_perl_exec (struct t_plugin_script *script,
             switch (format[i])
             {
                 case 's': /* string */
-                    XPUSHs(sv_2mortal(newSVpv((char *)argv[i], 0)));
+                    XPUSHs(sv_2mortal(newSVpvn_utf8((char *)argv[i], strlen ((char *)argv[i]), TRUE)));
                     break;
                 case 'i': /* integer */
                     XPUSHs(sv_2mortal(newSViv(*((int *)argv[i]))));
