diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,7 @@
+## 1.6.4
+
+* Add `addContentDispositionFileName` [#1504](https://github.com/yesodweb/yesod/pull/1504)
+
 ## 1.6.3
 
 * Add missing export for `SubHandlerFor`
diff --git a/Yesod/Core/Handler.hs b/Yesod/Core/Handler.hs
--- a/Yesod/Core/Handler.hs
+++ b/Yesod/Core/Handler.hs
@@ -118,6 +118,7 @@
     , setHeader
     , replaceOrAddHeader
     , setLanguage
+    , addContentDispositionFileName
       -- ** Content caching and expiration
     , cacheSeconds
     , neverExpires
@@ -779,6 +780,26 @@
 -- next request.
 setLanguage :: MonadHandler m => Text -> m ()
 setLanguage = setSession langKey
+
+-- | Set attachment file name.
+--
+-- Allows Unicode characters by encoding to UTF-8.
+-- Some modurn browser parse UTF-8 characters with out encoding setting.
+-- But, for example IE9 can't parse UTF-8 characters.
+-- This function use
+-- <https://tools.ietf.org/html/rfc6266 RFC 6266>(<https://tools.ietf.org/html/rfc5987 RFC 5987>)
+--
+-- @since 1.6.4
+addContentDispositionFileName :: MonadHandler m => T.Text -> m ()
+addContentDispositionFileName fileName
+    = addHeader "Content-Disposition" $ rfc6266Utf8FileName fileName
+
+-- | <https://tools.ietf.org/html/rfc6266 RFC 6266> Unicode attachment filename.
+--
+-- > rfc6266Utf8FileName (Data.Text.pack "€")
+-- "attachment; filename*=UTF-8''%E2%82%AC"
+rfc6266Utf8FileName :: T.Text -> T.Text
+rfc6266Utf8FileName fileName = "attachment; filename*=UTF-8''" `mappend` decodeUtf8 (H.urlEncode True (encodeUtf8 fileName))
 
 -- | Set an arbitrary response header.
 --
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         1.6.3
+version:         1.6.4
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
