BEGIN { my %escapes = ( "\\" => "\\\\", "\"" => "\\\"", "\n" => "\\n", "\r" => "\\r", "\t" => "\\t", ); my ($escapes) = map qr/[$_]/, join '', map quotemeta, keys %escapes; sub to_js_str_literal { for (my $s = $_[0]) { s/($escapes)/$escapes{$1}/g; s/([^\x20-\x7E])/sprintf("\\u%04X", ord($1))/eg; return qq{"$_"}; } } }