@@ -8,6 +8,7 @@ import copyImage from 'browser/main/lib/dataApi/copyImage'
88import { findStorage } from 'browser/lib/findStorage'
99import fs from 'fs'
1010import eventEmitter from 'browser/main/lib/eventEmitter'
11+ import iconv from 'iconv-lite'
1112const { ipcRenderer } = require ( 'electron' )
1213
1314CodeMirror . modeURL = '../node_modules/codemirror/mode/%N/%N.js'
@@ -324,7 +325,7 @@ export default class CodeEditor extends React.Component {
324325 fetch ( pastedTxt , {
325326 method : 'get'
326327 } ) . then ( ( response ) => {
327- return ( response . text ( ) )
328+ return this . decodeResponse ( response )
328329 } ) . then ( ( response ) => {
329330 const parsedResponse = ( new window . DOMParser ( ) ) . parseFromString ( response , 'text/html' )
330331 const value = editor . getValue ( )
@@ -342,6 +343,31 @@ export default class CodeEditor extends React.Component {
342343 } )
343344 }
344345
346+ decodeResponse ( response ) {
347+ const headers = response . headers
348+ const _charset = headers . has ( 'content-type' )
349+ ? this . extractContentTypeCharset ( headers . get ( 'content-type' ) )
350+ : undefined
351+ return response . arrayBuffer ( ) . then ( ( buff ) => {
352+ return new Promise ( ( resolve , reject ) => {
353+ try {
354+ const charset = _charset !== undefined && iconv . encodingExists ( _charset ) ? _charset : 'utf-8'
355+ resolve ( iconv . decode ( new Buffer ( buff ) , charset ) . toString ( ) )
356+ } catch ( e ) {
357+ reject ( e )
358+ }
359+ } )
360+ } )
361+ }
362+
363+ extractContentTypeCharset ( contentType ) {
364+ return contentType . split ( ';' ) . filter ( ( str ) => {
365+ return str . trim ( ) . toLowerCase ( ) . startsWith ( 'charset' )
366+ } ) . map ( ( str ) => {
367+ return str . replace ( / [ ' " ] / g, '' ) . split ( '=' ) [ 1 ]
368+ } ) [ 0 ]
369+ }
370+
345371 render ( ) {
346372 const { className, fontSize } = this . props
347373 let fontFamily = this . props . fontFamily
0 commit comments