+(defun hexl-insert-multibyte-char (ch num)
+ "Insert a possibly multibyte character CH NUM times.
+
+Non-ASCII characters are first encoded with `buffer-file-coding-system',
+and their encoded form is inserted byte by byte."
+ (let ((charset (char-charset ch))
+ (coding (if (or (null buffer-file-coding-system)
+ ;; coding-system-type equals t means undecided.
+ (eq (coding-system-type buffer-file-coding-system) t))
+ default-buffer-file-coding-system
+ buffer-file-coding-system)))
+ (cond ((and (> ch 0) (< ch 256))
+ (hexl-insert-char ch num))
+ ((eq charset 'unknown)
+ (error
+ "0x%x -- invalid character code; use \\[hexl-insert-hex-string]"
+ ch))
+ (t
+ (let ((encoded (encode-coding-char ch coding))
+ (internal (string-as-unibyte (char-to-string ch)))
+ internal-hex)
+ ;; If encode-coding-char returns nil, it means our character
+ ;; cannot be safely encoded with buffer-file-coding-system.
+ ;; In that case, we offer to insert the internal representation
+ ;; of that character, byte by byte.
+ (when (null encoded)
+ (setq internal-hex
+ (mapconcat (function (lambda (c) (format "%x" c)))
+ internal " "))
+ (if (yes-or-no-p
+ (format
+ "Insert char 0x%x's internal representation \"%s\"? "
+ ch internal-hex))
+ (setq encoded internal)
+ (error
+ "Can't encode `0x%x' with this buffer's coding system; try \\[hexl-insert-hex-string]"
+ ch)))
+ (while (> num 0)
+ (mapc
+ (function (lambda (c) (hexl-insert-char c 1))) encoded)
+ (setq num (1- num))))))))
+