diff --git a/Text/Css.hs b/Text/Css.hs
--- a/Text/Css.hs
+++ b/Text/Css.hs
@@ -26,7 +26,7 @@
     { _cssSelectors :: Builder
     , _cssAttributes :: [(Builder, Builder)]
     }
-data CssTop = Media String [Css'] | Css Css'
+data CssTop = Media String [Css'] | Css Css' | Charset String
 
 type Css = [CssTop]
 
@@ -55,6 +55,7 @@
     return $ cr `AppE` parseBlocks'' `AppE` (LitE $ StringL fp) `AppE` ListE c
   where
     go :: TopLevel -> [Content] -- FIXME use blockToCss
+    go (TopCharset cs) = [ContentRaw "@charset ", ContentRaw cs, ContentRaw ";"]
     go (MediaBlock _ blocks) = concatMap (go . TopBlock) blocks
     go (TopBlock (Block x y z)) =
         intercalate [ContentRaw ","] x ++
@@ -79,6 +80,7 @@
     return $ foldr ($) [] $ map goTop a
   where
     goTop :: TopLevel -> Css -> Css
+    goTop (TopCharset cs) x = Charset cs : x
     goTop (TopBlock b) x = map Css (go b []) ++ x
     goTop (MediaBlock s b) x = Media s (foldr go [] b) : x
     go :: Block -> [Css'] -> [Css']
@@ -127,7 +129,7 @@
 
 data Block = Block Selector Pairs [Block]
 
-data TopLevel = TopBlock Block | MediaBlock String [Block]
+data TopLevel = TopBlock Block | MediaBlock String [Block] | TopCharset String
 
 type Pairs = [Pair]
 
@@ -138,6 +140,7 @@
 compressTopLevel :: TopLevel -> TopLevel
 compressTopLevel (TopBlock b) = TopBlock $ compressBlock b
 compressTopLevel (MediaBlock s b) = MediaBlock s $ map compressBlock b
+compressTopLevel x@TopCharset{} = x
 
 compressBlock :: Block -> Block
 compressBlock (Block x y blocks) =
@@ -187,6 +190,7 @@
   where
     go r (TopBlock b) = [|(++) $ map Css ($(blockToCss r b) [])|]
     go r (MediaBlock s b) = [|(:) $ Media $(lift s) $(blocksToCassius r b)|]
+    go r (TopCharset cs) = [|(:) $ Charset $(lift cs)|]
 
 blocksToCassius :: Name -> [Block] -> Q Exp
 blocksToCassius r a = do
@@ -202,6 +206,9 @@
         fromText (pack s) `mappend`
         singleton '{' `mappend`
         foldr mappend (singleton '}') (map renderCss' x)
+    go (Charset cs) = fromText (pack "@charset ") `mappend`
+                      fromText (pack cs) `mappend`
+                      singleton ';'
 
 renderCss' :: Css' -> Builder
 renderCss' (Css' _x []) = mempty
diff --git a/Text/Lucius.hs b/Text/Lucius.hs
--- a/Text/Lucius.hs
+++ b/Text/Lucius.hs
@@ -17,9 +17,7 @@
 import Text.Shakespeare.Base
 import Language.Haskell.TH.Quote (QuasiQuoter (..))
 import Language.Haskell.TH.Syntax
-import qualified Data.Text as TS
 import qualified Data.Text.Lazy as TL
-import qualified Text.Cassius as C
 import Text.ParserCombinators.Parsec hiding (Line)
 import Text.Css
 import Data.Char (isSpace)
@@ -140,10 +138,15 @@
   where
     go front = do
         whiteSpace
-        ((media <|> fmap TopBlock parseBlock) >>= \x -> go (front . (:) x))
+        ((charset <|> media <|> fmap TopBlock parseBlock) >>= \x -> go (front . (:) x))
             <|> (return $ map compressTopLevel $ front [])
+    charset = do
+        _ <- try $ string "@charset "
+        cs <- many1 $ noneOf ";"
+        _ <- char ';'
+        return $ TopCharset cs
     media = do
-        try $ string "@media "
+        _ <- try $ string "@media "
         name <- many1 $ noneOf "{"
         _ <- char '{'
         b <- parseBlocks id
diff --git a/shakespeare-css.cabal b/shakespeare-css.cabal
--- a/shakespeare-css.cabal
+++ b/shakespeare-css.cabal
@@ -1,5 +1,5 @@
 name:            shakespeare-css
-version:         0.10.0
+version:         0.10.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
